[javascript高手之路]寄生組合式繼承的優勢
在之前javascript物件導向系列的文章裡面,我們已經探討了組合繼承和寄生繼承,回顧下組合繼承:
function Person( uName ){ this.skills = [ 'php', 'javascript' ]; this.userName = uName; } Person.prototype.showUserName = function(){ return this.userName; } function Teacher ( uName ){ Person.call( this, uName ); } Teacher.prototype = new Person(); var oT1 = new Teacher( 'ghostwu' ); oT1.skills.push( 'linux' ); var oT2 = new Teacher( 'ghostwu' ); console.log( oT2.skills ); //php,javascript console.log( oT2.showUserName() ); //ghostwu
組合繼承有個缺點,父類的建構函式會被呼叫兩次.
第11行,設定子類原型物件(prototype),呼叫了第一次
第9行,例項化物件的時候,又呼叫一次
建構函式的目的是為了複製屬性,第9行肯定是不能少的,第11行的目的是為了獲取到父類原型物件(prototype)上的方法,基於這個目的,有沒有別的方法
可以做到 在不需要例項化父類建構函式的情況下,也能得到父類原型物件上的方法呢? 當然可以,我們可以採用寄生式繼承來得到父類原型物件上的方法
function Person( uName ){ this.skills = [ 'php', 'javascript' ]; this.userName = uName; } Person.prototype.showUserName = function(){ return this.userName; } function Teacher ( uName ){ Person.call( this, uName ); } function object( o ){ var G = function(){}; G.prototype = o; return new G(); } function inheritPrototype( subObj, superObj ){ var proObj = object( superObj.prototype ); //複製父類superObj的原型物件 proObj.constructor = subObj; //constructor指向子類建構函式 subObj.prototype = proObj; //再把這個物件給子類的原型物件 } inheritPrototype( Teacher, Person ); var oT1 = new Teacher( 'ghostwu' ); oT1.skills.push( 'linux' ); var oT2 = new Teacher( 'ghostwu' ); console.log( oT2.skills ); //php,javascript console.log( oT2.showUserName() ); //ghostwu
其實,說白了寄生組合式繼承就是一個借用建構函式 + 相當於淺複製父類的原型物件
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3549/viewspace-2815863/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 組合優於繼承繼承
- JavaScript中的繼承和組合JavaScript繼承
- 一篇文章理解JS繼承——原型鏈/建構函式/組合/原型式/寄生式/寄生組合/Class extendsJS繼承原型函式
- Docker的組合優於繼承 - frankelDocker繼承
- javascript組合繼承的基本原理JavaScript繼承
- JavaScript的繼承JavaScript繼承
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- JavaScript繼承JavaScript繼承
- JavaScript 繼承JavaScript繼承
- javascript:繼承JavaScript繼承
- JavaScript中的繼承JavaScript繼承
- javascript繼承的方式JavaScript繼承
- javascript的superclass繼承JavaScript繼承
- JavaScript繼承的多種方式和優缺點JavaScript繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- javascript之繼承JavaScript繼承
- JavaScript class 繼承JavaScript繼承
- JavaScript extends 繼承JavaScript繼承
- javascript類繼承JavaScript繼承
- 6種JavaScript繼承方式及優缺點JavaScript繼承
- JavaScript的繼承-轉載JavaScript繼承
- javascript的原型和繼承JavaScript原型繼承
- 繼承與組合繼承
- prefer 組合 to 繼承繼承
- 繼承的優缺點繼承
- 征服 JavaScript 面試:類繼承和原型繼承的區別JavaScript面試繼承原型
- [許可權設計]組的繼承:需要從多個父組繼承嗎?繼承
- JavaScript(2)之——繼承JavaScript繼承
- 深入JavaScript繼承原理JavaScript繼承
- JavaScript 繼承全解析JavaScript繼承
- JavaScript物件冒充繼承JavaScript物件繼承
- JavaScript繼承總結JavaScript繼承
- 搞懂 JavaScript 繼承原理JavaScript繼承
- Javascript 繼承和克隆JavaScript繼承
- 實現JavaScript繼承JavaScript繼承
- Javascript繼承,再談JavaScript繼承
- JavaScript之物件繼承JavaScript物件繼承
- JavaScript原型和繼承JavaScript原型繼承