首先看一下經典的JavaScript的繼承機制。
定義一個名為BaseClass的類,然後為BaseClass定義兩個函數:someMethod()和overridenMethod().
var BaseClass = function(){
//do something
};
BaseClass.prototype.someMethod = function(){
//do something
};
BaseClass.prototype.overridenMethod = function(){
//do something
};
使用傳統方式在JavaScript中實作類別的繼承操作
var SubClass = function(){
BaseClass.call(this);
};
SubClass.prototype = new BaseClass();
SubClass.prototype .newMethod = function(){
//do something
};
SubClass.prototype.overridenMethod = function(){
//do something
};
SubClass的建構函式中首先調用BaseClass的建構函式初始化資料,然後通過
SubClass.prototype = new BaseClass();
這條語句讓SubClass類獲得BaseClass中的所有屬性和函數,從而實現了JavaScript中的繼承操作,為子類添加了新函數而且覆蓋了父類中的同名函數。
在ExtJS中使用Ext.extend()函數實現繼承功能
var SubClass = function(){
SubClass.superclass.constructor.call(this);
};
Ext.extend(SubClass,BaseClass,{
newMethod: function(){};
overridenMethod: function(){};
};
Ext.extend()函數提供了直接存取父類建構函式的途徑,通過SubClass.superclass.constructor.call(this);就可以直接調用父類的建構函式,這個函數的第一個參數總是this,以確保父類的建構函式在子類的範圍裡工作。
如果父類的建構函式需要傳入參數,可以講所需的參數直接傳遞給它:
SubClass.superclass.constructor.call(this,config);這樣就得到了一個繼承了父類的所有屬性和函數的子類。
Ext.apply函數的作用是將一個對象中的所有屬性都複製到另一個對象中。
Ext.applyIf與Ext.apply的作用類似,區別在於如果某個屬性在目標對象中已經存在,則Ext.applyIf不會將它覆蓋。