日期:2014-05-16  浏览次数:20424 次

Extjs中的类和继承
以下是类的两种构造方法:
1. 声明Person类,定义构造函数
var Person=function(name,age){
   //声明两个两个变量
    this.name=name;
    this.age=age;
}
定义Person类中的sayHello方法
Person.prototype.sayHello=function(){

}
2.通过属性形式定义类的构造函数
Person.prototype={

//其中可以定义变量,属性,方法等
  name:"zhang",
  sayHello:function(){

  }
}

Ext中的类继承通过三个方法来实现:
Ext.extend() 、 Ext.apply() 、 Ext.applyIf()

Ext.apply(obj, config, [defaults]) 将config对象的所有属性都复制到另一个对象obj上,第三个参数defaults可以用来提供默认值,不过通常指用前两个参数就够了。这个函数主要用在构造函数中,用来将配置复制到对象上。
Ext.applyIf(obj, config) 和Ext.apply的功能类似,唯一不同的是,这个函数只会将config对象中有,而obj对象中没有的属性复制到obj上。
Ext.extend(subclass, superclass, [overrides]) 用来继承已有的类,通常的使用方法有
使用传统方式在JavaScript中实现类的继承操作:
//定义一个子类,构造函数中访问父类的构造函数
var SubClass = function(){
   BaseClass.call(this);
};
//定义子类的构造函数
SubClass.prototype = new BaseClass();
//定义子类的新方法
SubClass.prototype .newMethod = function(){
  //do something
};
SubClass.prototype.overridenMethod = function(){
  //do something
};
在ExtJS中使用Ext.extend()函数实现继承功能:
var SubClass = function() {
//调用父类的构造函数    
SubClass.superclass.constructor.call(this);
};
Ext.extend(SubClass, BaseClass, {     newMethod : function() {},     overriddenMethod : function() {} }; 
Extjs中替换constructor,写法如下:
// initComponent replaces the constructor: 
SubClass = Ext.extend(BaseClass, {      
initComponent : function(){  
// call superclass initComponent         
Ext.Container.superclass.initComponent.call(this);              this.addEvents({              
// add events          
});       }   } 
Ext.extend()函数提供了直接访问父类构造函数的途径,通过 SubClass.superclass.constructor.call(this);就可以直接调用父类的构造函数,这个函数的第一个参数总是 this,以确保父类的构造函数在子类的作用域里工作。
如果父类的构造函数需要传入参数,可以讲所需的参数直接传递给它:
SubClass.superclass.constructor.call(this,config);这样就得到了一个继承了父类的所有属性和函数的子类。

Ext.apply函数的作用是将一个对象中的所有属性都复制到另一个对象中。
Ext.applyIf与Ext.apply的作用类似,区别在于如果某个属性在目标对象中已经存在,则Ext.applyIf不会将它覆盖。
在上面的代码中, SubClass继承自BaseClass, 添加了新的方法newMethod,重写了overriddenMethod方法。

     再看下面的例子:
        SuperClass=function()
        {          
        }
        SuperClass.prototype.AA=function()
        {
            alert('aa');
        }
      
        SubClass=function()
        {
            SubClass.superclass.constructor.call(this);          
        }
        Ext.extend(SubClass,SuperClass,
            {
                BB:function(){alert('新方法');},
&nb