[js高手之路]寄生組合式繼承的優點

在以前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

相關文章
相關標籤/搜索