研究javascript是很有意思的事情,以前我說過,在javascript中的繼承,在於維持prototype指向同一object就行了,確實這樣。
我今天做的嘗試是,如何更它更像其他的語言一樣的使用繼承機制,多層繼承和更方面的調用父類的構造。
我希望達到的效果:
function A(){
alert('a');
}
function B(){
this.$supClass();
alert('b');
}
extend(B,A);
function C(){
this.$supClass();
alert('c');
}
extend(C,B);
var c = new C();
alert( c instanceof A ); // true
alert( c instanceof B ); // true
alert( c instanceof C ); // true
alert('a');
}
function B(){
this.$supClass();
alert('b');
}
extend(B,A);
function C(){
this.$supClass();
alert('c');
}
extend(C,B);
var c = new C();
alert( c instanceof A ); // true
alert( c instanceof B ); // true
alert( c instanceof C ); // true
實例:
我的extend是這樣寫的:
1
function extend(subClass,supClass){
2 var fun = function(){},
3 prototype = subClass.prototype;
4 fun.prototype = supClass.prototype;
5 subClass.prototype = new fun();
6 for( var i in prototype){
7 subClass.prototype[i] = prototype[i];
8 }
9 subClass.$supClass = supClass;
10 subClass.prototype.$supClass = function(){
11 var supClass = arguments.callee.caller.$supClass;
12 if( typeof supClass == 'function'){
13 supClass.apply( this,arguments);
14 this.$supClass = supClass;
15 }
16 };
17 subClass.prototype.constructor = subClass;
18 return subClass;
19 }
2 var fun = function(){},
3 prototype = subClass.prototype;
4 fun.prototype = supClass.prototype;
5 subClass.prototype = new fun();
6 for( var i in prototype){
7 subClass.prototype[i] = prototype[i];
8 }
9 subClass.$supClass = supClass;
10 subClass.prototype.$supClass = function(){
11 var supClass = arguments.callee.caller.$supClass;
12 if( typeof supClass == 'function'){
13 supClass.apply( this,arguments);
14 this.$supClass = supClass;
15 }
16 };
17 subClass.prototype.constructor = subClass;
18 return subClass;
19 }
也許你會問,為什么不這樣寫:
function extend(subClass,supClass){
var fun = function(){},
prototype = subClass.prototype;
fun.prototype = supClass.prototype;
subClass.prototype = new fun();
for( var i in prototype){
subClass.prototype[i] = prototype[i];
}
subClass.prototype.$supClass = function(){
supClass.apply( this,arguments);
};
subClass.prototype.constructor = subClass;
return subClass;
}
var fun = function(){},
prototype = subClass.prototype;
fun.prototype = supClass.prototype;
subClass.prototype = new fun();
for( var i in prototype){
subClass.prototype[i] = prototype[i];
}
subClass.prototype.$supClass = function(){
supClass.apply( this,arguments);
};
subClass.prototype.constructor = subClass;
return subClass;
}
這樣看似沒有問題,只有一級繼承時會運行的很好,但是,如果多級繼承時,就會造成死循環,因為:
subClass.prototype.$supClass =
function(){
supClass.apply( this,arguments);
};
supClass.apply( this,arguments);
};
這個方法會被一直覆蓋重寫掉,而造成死循環。
而我的做法是,用類的$supClass屬性指向它所繼承的父類構造,在prototype中也有個$supClass方法,這個$supClass第一次必須要在類的構造器中執行,prototype.$supClass在執行時,會通過arguments.callee.caller.$supClass來獲得類的$supClass,然后通過apply在this執行。 這樣$subClass就能根據不同的來,來獲得類的父類構造器並執行。