javascript類式繼承新的嘗試
更新時間:2012年01月09日 16:35:53 作者:
研究javascript是很有意思的事情,以前我說過,在javascript中的繼承,在于維持prototype指向同一object就行了,確實這樣
我今天做的嘗試是,如何更它更像其他的語言一樣的使用繼承機制,多層繼承和更方面的調(diào)用父類的構(gòu)造。
我希望達(dá)到的效果:
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
實例:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
我的extend是這樣寫的:
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.$supClass = supClass;
subClass.prototype.$supClass = function(){
var supClass = arguments.callee.caller.$supClass;
if(typeof supClass == 'function'){
supClass.apply(this,arguments);
this.$supClass = supClass;
}
};
subClass.prototype.constructor = subClass;
return subClass;
}
也許你會問,為什么不這樣寫:
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;
}
這樣看似沒有問題,只有一級繼承時會運行的很好,但是,如果多級繼承時,就會造成死循環(huán),因為:
subClass.prototype.$supClass = function(){
supClass.apply(this,arguments);
};
這個方法會被一直覆蓋重寫掉,而造成死循環(huán)。
而我的做法是,用類的$supClass屬性指向它所繼承的父類構(gòu)造,在prototype中也有個$supClass方法,這個$supClass第一次必須要在類的構(gòu)造器中執(zhí)行,prototype.$supClass在執(zhí)行時,會通過arguments.callee.caller.$supClass來獲得類的$supClass,然后通過apply在this執(zhí)行。 這樣$subClass就能根據(jù)不同的來,來獲得類的父類構(gòu)造器并執(zhí)行。
我希望達(dá)到的效果:
復(fù)制代碼 代碼如下:
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
實例:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
我的extend是這樣寫的:
復(fù)制代碼 代碼如下:
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.$supClass = supClass;
subClass.prototype.$supClass = function(){
var supClass = arguments.callee.caller.$supClass;
if(typeof supClass == 'function'){
supClass.apply(this,arguments);
this.$supClass = supClass;
}
};
subClass.prototype.constructor = subClass;
return subClass;
}
也許你會問,為什么不這樣寫:
復(fù)制代碼 代碼如下:
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;
}
這樣看似沒有問題,只有一級繼承時會運行的很好,但是,如果多級繼承時,就會造成死循環(huán),因為:
復(fù)制代碼 代碼如下:
subClass.prototype.$supClass = function(){
supClass.apply(this,arguments);
};
這個方法會被一直覆蓋重寫掉,而造成死循環(huán)。
而我的做法是,用類的$supClass屬性指向它所繼承的父類構(gòu)造,在prototype中也有個$supClass方法,這個$supClass第一次必須要在類的構(gòu)造器中執(zhí)行,prototype.$supClass在執(zhí)行時,會通過arguments.callee.caller.$supClass來獲得類的$supClass,然后通過apply在this執(zhí)行。 這樣$subClass就能根據(jù)不同的來,來獲得類的父類構(gòu)造器并執(zhí)行。
相關(guān)文章
Javascript面向?qū)ο笤O(shè)計一 工廠模式
工廠模式抽象了創(chuàng)建具體對象的過程,但是在ECMAScript中無法創(chuàng)建類,所以就使用一種函數(shù)來封裝以特定接口創(chuàng)建對象的細(xì)節(jié)2011-12-12JavaScript面向?qū)ο?極簡主義法minimalist approach)
荷蘭程序員 Gabor de Mooij 提出了一種比 Object.create ()更好的新方法,他稱這種方法為極簡主義法(minimalist approach)。這也是我推薦的方法2012-07-07js面向?qū)ο?多種創(chuàng)建對象方法小結(jié)
js面向?qū)ο?多種創(chuàng)建對象方法小結(jié),需要的朋友可以參考下2012-05-05JavaScript 基于原型的對象(創(chuàng)建、調(diào)用)
在我們寫js代碼的時候,內(nèi)部對象是不可避免的要引用,但是光靠這些對象是不夠的,所以需要我們自己定義對象,這個時候通常用到的對象是第三種,即基于原型的對象,下面就如何創(chuàng)建自己的對象,定義對象的方法、屬性,調(diào)用對象給出詳細(xì)的說明。2009-10-10JavaScript的單例模式 (singleton in Javascript)
JavaScript的單例模式 (singleton in Javascript)2010-06-06討論javascript(一)工廠方式 js面象對象的定義方法
看《javascript高級程序設(shè)計》有感2009-12-12