在以前javascript面向對象系列的文章裏面,咱們已經探討了組合繼承和寄生繼承,回顧下組合繼承: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,javascript 17 console.log( oT2.showUserName() ); //ghostwu
組合繼承有個缺點,父類的構造函數會被調用兩次.php
第11行,設置子類原型對象(prototype),調用了第一次html
第9行,實例化對象的時候,又調用一次java
構造函數的目的是爲了複製屬性,第9行確定是不能少的,第11行的目的是爲了獲取到父類原型對象(prototype)上的方法,基於這個目的,有沒有別的方法linux
能夠作到 在不須要實例化父類構造函數的狀況下,也能獲得父類原型對象上的方法呢? 固然能夠,咱們能夠採用寄生式繼承來獲得父類原型對象上的方法函數
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,javascript 30 console.log( oT2.showUserName() ); //ghostwu
其實,說白了寄生組合式繼承就是一個借用構造函數 + 至關於淺拷貝父類的原型對象this