1. 程式人生 > >JS類的封裝及實現程式碼

JS類的封裝及實現程式碼


// 
//物件屬性複製方法,很多庫都有實現,如PrototypeJS裡面的extend和Ext裡面的Ext.apply 
// 
function extend(des, src) { 
if (!des) 
des = {}; 
if (src) { 
for (var i in src) { 
des[i] = src[i]; 


return des; 

var CC = {}; //全域性變數 
// 
//create 用於建立類 
// 
CC.create = function(superclass, constructor){ 
var clazz = (function() { 
this.initialize.apply(this, arguments); 
}); 
//如果無引數,直接返回類. 
if(arguments.length == 0) 
return clazz; 
//如果無父類,此時constructor應該為一個純物件,直接複製屬性返回. 
if(!superclass){ 
extend(clazz.prototype, constructor); 
return clazz; 

var absObj = clazz.prototype, 
sprPropty = superclass.prototype; 
if(sprPropty){ 
//用於訪問父類方法 
clazz.superclass = sprPropty; 
extend(absObj, sprPropty); 
//呼叫屬性建構函式建立屬性,這個是實現關鍵. 
extend(absObj, constructor(sprPropty)); 
// 子類例項直接通過obj.superclass訪問父類屬性, 
// 如果不想造成過多引用,也可把這句註釋掉,因為多數時候是沒必要的. 
absObj.superclass = sprPropty; 
// 
clazz.constructor = constructor; 

return clazz; 

// 
//建立一個動物類 
// 
var Animal = CC.create(null, { 
//屬性 
footprint : '- - - - - - =', 
//類初始化方法,必須的,當用 new 生成一個類時該方法自動被呼叫,參見上定義. 
initialize : function(options){ 
extend(this, options); 
alert('Animal initialize method is called.'); 
}, 
eat : function(){ 
alert('Animal eat method is called.'); 
}, 
move : function(){ 
alert('I am moving like this '+ this.footprint +' .'); 

}); 
// 
//建立一個Duke類 
// 
var Duke = CC.create(Animal, function(superclass){ 
//在這可以定義一些類全域性靜態資料,該類每個例項都共享這些資料. 
//計算例項個類,包括派生類例項. 
var static_instance_counter = 0; 
function classUtilityFuncHere(){ } 
//返回類具體屬性. 
return { 
//重寫初始化方法 
//@override 
initialize : function(options) { 
alert('Initializing Duke class..'); 
//呼叫父類初始化,這種方法比一般其它庫的要簡潔點吧,可以不管父類是什麼. 
superclass.initialize.call(this, options); 
//做一些子類喜歡做的事. 
alert('Duke initialize method is called.'); 
//讀取或修改類靜態屬性 
static_instance_counter++; 
}, 
//重寫move方法,增加Duke自己的移動方式. 
move : function(){ 
this.footprint = this.footprint + 'zzzzzzzz'; 
superclass.move.call(this); 
}, 
//重寫eat方法,注意,裡面不呼叫父類方法,即父類eat被覆蓋了. 
eat : function(){ 
alert('Duke is eating..'); 
}, 
//新增一個say方法,顯示當前已經初始化的Duke類例項數量. 
say : function(){ 
alert('the number of Duke instances is '+static_instance_counter); 

}; 
}); 
var DukeChild = CC.create(Duke, function(superclass){ 
return { 
move : function(){ 
this.footprint = this.footprint + '++++++++++++='; 
superclass.move.call(this); 
}, 
say : function(){ 
alert(this.msg || ''); 

}; 
}); 
(function test() { 
var animal = new Animal(); 
animal.eat(); 
animal.move(); 
var dukeA = new Duke(); 
dukeA.eat(); 
dukeA.move(); 
dukeA.say(); 
var dukeB = new Duke(); 
dukeB.eat(); 
dukeB.move(); 
dukeB.say(); 
var dukeC = new DukeChild({msg : 'I am a child of duke.'}); 
dukeC.move(); 
dukeC.say(); 
})();