javascript類式繼承新的嘗試


研究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

實例:


 我的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 }

 也許你會問,為什么不這樣寫:

 

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;
}

 這樣看似沒有問題,只有一級繼承時會運行的很好,但是,如果多級繼承時,就會造成死循環,因為:

subClass.prototype.$supClass =  function(){
    supClass.apply( this,arguments);
};

 這個方法會被一直覆蓋重寫掉,而造成死循環。

 而我的做法是,用類的$supClass屬性指向它所繼承的父類構造,在prototype中也有個$supClass方法,這個$supClass第一次必須要在類的構造器中執行,prototype.$supClass在執行時,會通過arguments.callee.caller.$supClass來獲得類的$supClass,然后通過apply在this執行。 這樣$subClass就能根據不同的來,來獲得類的父類構造器並執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM