javascript的多根繼承和多層繼承
上篇文章貼出后又想了兩個問題:
仔細一想,多層繼承上篇文章的代碼已經實現。多根繼承則需要進一步完善extend方法。于是有了下面的代碼,使用方法很簡單。只要一句話可以輕松實現對多個父類的繼承。下面是詳細的示例源代碼。歡迎交流,QQ:27234687 。讀者可以自行修改后點【測試】按鈕查看輸出結果。 /** 多根繼承方法, 參數可以支持多個父類參數 子類將按順序繼承所有父類的方法, 如果父類中有重復的方法則繼承父類列表中在后面的類 父類的方法通過this.superClass.method()調用,可以調用所有父類方法 */ Object.prototype.extend = function(){ this.superClass={} for(var i=0;i<arguments.length;i++){ this.SuperClass=arguments[i]; this.SuperClass(); this.superClass.SuperClass=arguments[i]; this.superClass.SuperClass() } } //聲明父類1:第一個方法show將得到繼承,第二個方法將被覆蓋 function SuperClass1(){ this.show=function(){ alert('Call SuperClass1.show()'); } this.override=function(){ alert('Call SuperClass1.override()'); } } //聲明父類2:子類將繼承speak方法 function SuperClass2(){ this.speak=function(){ alert('Call SuperClass2.speak()'); } } //聲明子類:繼承父類1和父類2,同時覆蓋了父類1的方法override function SubClass(){ //調用繼承方法繼承父類的屬性和方法 this.extend(SuperClass1,SuperClass2); this.override=function(){ alert("Call SubClass.override()。I will call my superClass's method SuperClass1.override()"); this.superClass.override(); } this.sing=function(){ alert('Call SubClass.sing()'); } } //子類的子類,多層繼承展示:將通過繼承SubClass得到SuperClass1和SuperClass2的方法以及SubClass的方法 function SubSubClass(){ this.extend(SubClass); this.talk=function(){ alert('call SubSubClass.talk()'); } } //測試子類的繼承的結果: var s=new SubClass(); s.show(); //將調用SuperClass1的方法 s.speak(); //將調用SuperClass2的方法 s.override();//將調用SubClass的方法 s.sing();//將調用SubClass的sing方法 //測試孫類繼承的結果: var s=new SubSubClass(); s.show(); //將調用SuperClass1的方法 s.speak(); //將調用SuperClass2的方法 s.override();//將調用SubClass的方法 s.sing();//將調用SubClass的sing方法 s.talk();//將調用SubSubClass.talk方法 測試
JAVASCRIPT繼承方如此簡單
?????? 看了很多的js繼承方式都覺得不是很好,總是覺得不是很方便,用起來也不順。所以一直在查這方面的資料思考這個問題,終于有所收獲。忍不住要貼出來與大家共享,讓大家一起享受javascript繼承的快樂。優點:只要聲明一個簡單的函數即可方便使用JAVASCRIPT的繼承,使用方法也只要一行代碼調用繼承方法即可,調用方式非常自然。 ????????下面是示例源代碼:?? <script>??? /**?????? 首先給Object類添加繼承方法extends,?????? 前兩句起繼承父類的作用,使得調用的子類能夠獲得父類的所有屬性和方法?????? 后一句保存對一個對父類的引用,以便在需要的時候可以調用父類的方法?????? 如果不需要使用父類的方法,最后一句可以刪除???????方法名不能為extends,因為IE認為是關鍵字不讓用火狐下是可以的。屬性superClass也不能用super,也是關鍵字。不然看起來就更舒服了(那就太像java了)。??? */??? Object.prototype.extend = function(SuperClass){????? this.SuperClass=SuperClass;????? this.SuperClass();????? this.superClass=new SuperClass();??? }???//下面是示例代碼??? //聲明父類:第一個方法show將得到繼承,第二個方法將被覆蓋??? function SuperClass(){????? this.show=function(){??????? alert('Call SuperClass.show()');????? }????? this.override=function(){??????? alert('Call SuperClass.override() width "superClass.override()"');????? }??? }??? //聲明子類:繼承父類,同時覆蓋了父類的方法override??? function SubClass(){????? //調用繼承方法繼承父類的屬性和方法????? this.extend(SuperClass);????? this.override=function(){??????? alert('I have overrided SuperClass.override method.\nCall SubClass.override()');????? }??? }??? //測試繼承的結果:??? var s=new SubClass();??? s.show(); //將調用父類的方法??? s.override();//將調用子類覆蓋后的方法??? s.superClass.override();//將調用父類的override方法?</script>