资源描述:
《《extjs学习》word版》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、使用Ext.extend进行继承的一个有趣的问题在Ext的使用过程中,偶然发现了一个有趣的问题,和大家共享一下。先看如下代码://定义一个基类,一个数组成员arr,和一个空函数initvarBaseClass=Ext.extend(Ext.util.Observable,{arr:[],init:Ext.emptyFn});//定义一个子类,继承自BaseClass,并重写init方法,向数组arr中添加一个1varSubClass1=Ext.extend(BaseClass,{init:function(){th
2、is.arr.push(1);}});//再定义一个子类,也继承自BaseClass,并重写init方法,向数组arr中添加一个2varSubClass2=Ext.extend(BaseClass,{init:function(){this.arr.push(2);}});functionextTest(){varc1=newSubClass1();c1.init();alert(c1.arr);//这里得到的应该是1,结果也确实是1,没错varc2=newSubClass2();c2.init();alert(c
3、2.arr);//这里得到的应该是一个2,但是实际结果却是1,2,有趣的问题出现了}在执行extTest函数时,收到的两个alert分别是1和1,2,而且,如果不断的执行extTest函数,得到的值会不断的增加,这是什么原因呢?问题肯定是处在Ext.extend方法上,加载debug版本的脚本,对这个方法进行单步跟踪,发现最终问题出现在Ext.override函数上,看图:看来在那个for循环之中,只是将overrides中的各个属性进行简单赋值操作,但是,对于本例中出现的数组,赋值只能传递对数组的引用,也就是说S
4、ubClass1和SubClass2将共享一个数组,因为他们引用的是同一个数组,怪不得得到的结果会与期望的不一致呢。当然,对于上面的代码适当进行修改,既可以得到预期的值varBaseClass=Ext.extend(Ext.util.Observable,{arr:null,init:function(){this.arr=[];//initarrhere.}});varSubClass1=Ext.extend(BaseClass,{init:function(){SubClass1.superclass.init
5、.call(this);//callbaseclass'sinitfunctionthis.arr.push(1);}});varSubClass2=Ext.extend(BaseClass,{init:function(){SubClass2.superclass.init.call(this);//callbaseclass'sinitfunctionthis.arr.push(2);}});functionextTest(){varc1=newSubClass1();c1.init();alert(c1.ar
6、r);varc2=newSubClass2();c2.init();alert(c2.arr);}虽然这只是一个很小的问题,但是却不容忽视,我就犯了一个这样的“错误”,郁闷了好长时间才发现原因,因此给大家提个醒。Ext.extend用法以及代码解读概述Ext.extend是Ext的继承机制,这个函数的代码相当难懂。要明白这个函数的代码,首先要知道这个函数如何使用。使用方式使用示例假设有个function名为SuperClass,要实现一个子类,名为MyClass。下面的两种方式都可以实现这个功能。MyClass=E
7、xt.extend(SuperClass,{/**/});Ext.extend(MyClass,SuperClass,{/**/}); 下面来个具体示例:vara=function(id){ this.id=id;}a.prototype={ tostring:function(){ returnthis.id; }}; b=function(id){ b.superclass.constructor.call(this,id);}Ext.extend(b,a,{
8、 tostring:function(){ returnString.format("b:{0}",this.id); }});//测试一下varobj1=newa("obj1");alert(obj1.tostring());varobj2=newb("obj2");alert(obj2.tostring());或者下面的代码,可以得到同样