標籤:回顧 targe obj teacher 對象 javascrip 調用 html 不能
在之前javascript物件導向系列的文章裡面,我們已經探討了組合繼承和寄生繼承,回顧下組合繼承:
1 function Person( uName ){ 2 this.skills = [ ‘php‘, ‘javascript‘ ]; 3 this.userName = uName; 4 } 5 Person.prototype.showUserName = function(){ 6 return this.userName; 7 } 8 function Teacher ( uName ){ 9 Person.call( this, uName );10 }11 Teacher.prototype = new Person();12 13 var oT1 = new Teacher( ‘ghostwu‘ );14 oT1.skills.push( ‘linux‘ );15 var oT2 = new Teacher( ‘ghostwu‘ );16 console.log( oT2.skills ); //php,javascript17 console.log( oT2.showUserName() ); //ghostwu
組合繼承有個缺點,父類的建構函式會被調用兩次.
第11行,設定子類原型對象(prototype),調用了第一次
第9行,執行個體化對象的時候,又調用一次
建構函式的目的是為了複製屬性,第9行肯定是不能少的,第11行的目的是為了擷取到父類原型對象(prototype)上的方法,基於這個目的,有沒有別的方法
可以做到 在不需要執行個體化父類建構函式的情況下,也能得到父類原型對象上的方法呢? 當然可以,我們可以採用寄生式繼承來得到父類原型對象上的方法
1 function Person( uName ){ 2 this.skills = [ ‘php‘, ‘javascript‘ ]; 3 this.userName = uName; 4 } 5 Person.prototype.showUserName = function(){ 6 return this.userName; 7 } 8 function Teacher ( uName ){ 9 Person.call( this, uName );10 }11 12 function object( o ){13 var G = function(){};14 G.prototype = o;15 return new G();16 }17 18 function inheritPrototype( subObj, superObj ){19 var proObj = object( superObj.prototype ); //複製父類superObj的原型對象20 proObj.constructor = subObj; //constructor指向子類建構函式21 subObj.prototype = proObj; //再把這個對象給子類的原型對象22 }23 24 inheritPrototype( Teacher, Person );25 26 var oT1 = new Teacher( ‘ghostwu‘ );27 oT1.skills.push( ‘linux‘ );28 var oT2 = new Teacher( ‘ghostwu‘ );29 console.log( oT2.skills ); //php,javascript30 console.log( oT2.showUserName() ); //ghostwu
其實,說白了寄生組合式繼承就是一個借用建構函式 + 相當於淺拷貝父類的原型對象
[js高手之路]寄生組合式繼承的優勢