JS類的封裝及實現程式碼
阿新 • • 發佈:2019-01-10
//
//物件屬性複製方法,很多庫都有實現,如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();
})();