小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

javascript重構(gòu)小結(jié)

 青格兒 2015-03-28

首先先來學(xué)習(xí)一下js 的幾種繼承方法:

1、原型鏈繼承:

Js代碼  收藏代碼
  1. var Base = function()  
  2. {  
  3.     this.level = 1;  
  4.     this.name = "base";  
  5.     this.toString = function(){  
  6.         return "base";  
  7.     };  
  8. };  
  9. Base.CONSTANT = "constant";  
  10.   
  11. var Sub = function()  
  12. {  
  13. };  
  14. Sub.prototype = new Base();  
  15. Sub.prototype.name = "sub";  

 

優(yōu)點:從instanceof關(guān)鍵字來看,實例既是父類的實例,又是子類的實例,看起來似乎是最純粹的繼承。

缺點:子類區(qū)別于父類的屬性和方法,必須在Sub.prototype = new Base();這樣的語句之后分別執(zhí)行,無法被包裝到Sub這個構(gòu)造器里面去。例如:Sub.prototype.name = "sub";無法實現(xiàn)多重繼承。

 

 

2、構(gòu)造繼承:

Js代碼  收藏代碼
  1. var Base = function()  
  2. {  
  3.     this.level = 1;  
  4.     this.name = "base";  
  5.     this.toString = function(){  
  6.         return "base";  
  7.     };  
  8. };  
  9. Base.CONSTANT = "constant";  
  10.   
  11. var Sub = function()  
  12. {  
  13.     Base.call(this);  
  14.     this.name = "sub";  
  15. };  

優(yōu)點:可以實現(xiàn)多重繼承,可以把子類特有的屬性設(shè)置放在構(gòu)造器內(nèi)部。

缺點:使用instanceof發(fā)現(xiàn),對象不是父類的實例。

 

 

3、實例繼承:

Js代碼  收藏代碼
  1. var Base = function()  
  2. {  
  3.     this.level = 1;  
  4.     this.name = "base";  
  5.     this.toString = function(){  
  6.         return "base";  
  7.     };  
  8. };  
  9. Base.CONSTANT = "constant";  
  10.   
  11. var Sub = function()  
  12. {  
  13.     var instance = new Base();  
  14.     instance.name = "sub";  
  15.     return instance;  
  16. };  

優(yōu)點:是父類的對象,并且使用new構(gòu)造對象和不使用new構(gòu)造對象,都可以獲得相同的效果。

缺點:生成的對象實質(zhì)僅僅是父類的實例,并非子類的對象;不支持多繼承。

 

 

4、拷貝繼承:

Js代碼  收藏代碼
  1. var Base = function()  
  2. {  
  3.     this.level = 1;  
  4.     this.name = "base";  
  5.     this.toString = function(){  
  6.         return "base";  
  7.     };  
  8. };  
  9. Base.CONSTANT = "constant";  
  10.   
  11. var Sub = function()  
  12. {  
  13.     var base = new Base();  
  14.     for(var i in base)  
  15.         Sub.prototype[i] = base[i];  
  16.     Sub.prototype["name"] = "sub";  
  17. };  

優(yōu)點:支持多繼承。

缺點:效率較低;無法獲取父類不可枚舉的方法。

 

 

這幾種形式各有特點,僅就我提供的代碼而言,滿足下面的表格:

 

instanceof父類instanceof子類子類constructor不可枚舉方法的繼承多繼承可實現(xiàn)
原型鏈繼承TRUETRUEFALSETRUEFALSE
構(gòu)造繼承FALSETRUETRUETRUETRUE
實例繼承TRUEFALSEFALSETRUEFALSE
拷貝繼承FALSETRUETRUEFALSETRUE

 

補(bǔ)充,如果我們不需要類繼承,只需要對象繼承,對于支持 ECMAScript 5 的瀏覽器來說,還可以用Object.create方法來實現(xiàn):

Js代碼  收藏代碼
  1. var Base = function()  
  2. {  
  3.     this.level = 1;  
  4.     this.name = "base";  
  5.     this.toString = function(){  
  6.         return "base";  
  7.     };  
  8. };  
  9. Base.CONSTANT = "constant";  
  10.   
  11. var sub = Object.create(new Base());  
  12. sub.name = "sub";  



類似接口 功能:
Java代碼  收藏代碼
  1. function Rect(){   
  2.   this.drawRect = function(){   
  3.     alert("rect");   
  4.   }   
  5. }   
  6.   
  7. function Person(obj){   
  8. //obj參數(shù)的格式:{doWhat,who}   
  9.   for(var i in obj){   
  10.     this.doWhat = i;   
  11.     this.who = obj[i];   
  12.     break;   
  13.   }   
  14.   this.draw = function(){   
  15.     this.who[this.doWhat].call(this.who);   
  16.   };   
  17. }   
  18.   
  19. var rou = { drawRound : new Round() };   
  20. var rec = { drawRect : new Rect() };   
  21. (new Person(rou)).draw();   
  22. (new Person(rec)).draw();  



更多重構(gòu)的知識請參看:http://raychase./blog/1174362

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多