Extjs 繼承的使用首先看一下經(jīng)典的JavaScript的繼承機(jī)制,。 定義一個(gè)名為BaseClass的類,然后為BaseClass定義兩個(gè)函數(shù):someMethod()和overridenMethod(). var BaseClass = function(){ //do something }; BaseClass.prototype.someMethod = function(){ //do something }; BaseClass.prototype.overridenMethod = function(){ //do something }; 談到類和繼承,, 有幾個(gè)函數(shù)必須注意,, Ext.apply、 Ext.applyIf和Ext.extend:
- Ext.apply(obj, config, [defaults]) 將config對(duì)象的所有屬性都復(fù)制到另一個(gè)對(duì)象obj上,,第三個(gè)參數(shù)defaults可以用來提供默認(rèn)值,,不過通常指用前兩個(gè)參數(shù)就夠了。這個(gè)函數(shù)主要用在構(gòu)造函數(shù)中,, 用來將配置復(fù)制到對(duì)象上,。
- Ext.applyIf(obj, config) 和Ext.apply的功能類似,唯一不同的是,,這個(gè)函數(shù)只會(huì)將config對(duì)象中有,,而obj對(duì)象中沒有的屬性復(fù)制到obj上。
- Ext.extend(subclass, superclass, [overrides]) 用來繼承已有的類,, 通常的使用方法有
使用傳統(tǒng)方式在JavaScript中實(shí)現(xiàn)類的繼承操作: 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()函數(shù)實(shí)現(xiàn)繼承功能: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()函數(shù)提供了直接訪問父類構(gòu)造函數(shù)的途徑,通過 SubClass.superclass.constructor.call(this);就可以直接調(diào)用父類的構(gòu)造函數(shù),,這個(gè)函數(shù)的第一個(gè)參數(shù)總是 this,,以確保父類的構(gòu)造函數(shù)在子類的作用域里工作,。 如果父類的構(gòu)造函數(shù)需要傳入?yún)?shù),可以講所需的參數(shù)直接傳遞給它: SubClass.superclass.constructor.call(this,config);這樣就得到了一個(gè)繼承了父類的所有屬性和函數(shù)的子類,。 Ext.apply函數(shù)的作用是將一個(gè)對(duì)象中的所有屬性都復(fù)制到另一個(gè)對(duì)象中,。 Ext.applyIf與Ext.apply的作用類似,區(qū)別在于如果某個(gè)屬性在目標(biāo)對(duì)象中已經(jīng)存在,,則Ext.applyIf不會(huì)將它覆蓋,。 在上面的代碼中, 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('新方法');}, AA:function(){alert('重寫方法');} }//配置信息主要用來重寫父類的方法和添加新方法 ); var sub=new SubClass(); sub.AA(); sub.BB();
|