国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

[js高手之路]從原型鏈開始圖解繼承到組合繼承的產生詳解

來源:懂視網 責編:小采 時間:2020-11-27 22:31:36
文檔

[js高手之路]從原型鏈開始圖解繼承到組合繼承的產生詳解

[js高手之路]從原型鏈開始圖解繼承到組合繼承的產生詳解:于javascript原型鏈的層層遞進查找規則,以及原型對象(prototype)的共享特性,實現繼承是非常簡單的事情 一、把父類的實例對象賦給子類的原型對象(prototype),可以實現繼承 function Person(){ this.userName = 'ghostwu'; }
推薦度:
導讀[js高手之路]從原型鏈開始圖解繼承到組合繼承的產生詳解:于javascript原型鏈的層層遞進查找規則,以及原型對象(prototype)的共享特性,實現繼承是非常簡單的事情 一、把父類的實例對象賦給子類的原型對象(prototype),可以實現繼承 function Person(){ this.userName = 'ghostwu'; }

于javascript原型鏈的層層遞進查找規則,以及原型對象(prototype)的共享特性,實現繼承是非常簡單的事情

一、把父類的實例對象賦給子類的原型對象(prototype),可以實現繼承

function Person(){
 this.userName = 'ghostwu';
 }
 Person.prototype.showUserName = function(){
 return this.userName;
 }
 function Teacher (){}
 Teacher.prototype = new Person();

 var oT = new Teacher(); 
 console.log( oT.userName ); //ghostwu
 console.log( oT.showUserName() ); //ghostwu

通過把父類(Person)的一個實例賦給子類Teacher的原型對象,就可以實現繼承,子類的實例就可以訪問到父類的屬性和方法

如果你不會畫這個圖,你需要去看下我的這篇文章:

[js高手之路]一步步圖解javascript的原型(prototype)對象,原型鏈

第11行,執行oT.userName, 首先去oT對象上查找,很明顯oT對象上沒有任何屬性,所以就順著oT的隱式原型__proto__的指向查找到Teacher.prototype,

發現還是沒有userName這個屬性,繼續沿著Teacher.prototype.__proto__向上查找,找到了new Person() 這個實例上面有個userName,值為ghostwu

所以停止查找,輸出ghostwu.

第12行,執行oT.showUserName前面的過程同上,但是在new Person()這個實例上還是沒有查找到showUserName這個方法,繼續沿著new Person()的

隱式原型__proto__的指向( Person.prototype )查找,在Person.prototype上找到了showUserName這個方法,停止查找,輸出ghostwu.

二、把父類的原型對象(prototype)賦給子類的原型對象(prototype),可以繼承到父類的方法,但是繼承不到父類的屬性

function Person(){
 this.userName = 'ghostwu';
 }
 Person.prototype.showUserName = function(){
 return 'Person::showUserName方法';
 }
 function Teacher (){}
 Teacher.prototype = Person.prototype;

 var oT = new Teacher(); 
 console.log( oT.showUserName() ); //ghostwu
 console.log( oT.userName ); //undefined, 沒有繼承到父類的userName

因為Teacher.prototype的隱式原型(__proto__)只指向Person.prototype,所以獲取不到Person實例的屬性

三、發生繼承關系后,實例與構造函數(類)的關系判斷

還是通過instanceof和isPrototypeOf判斷

function Person(){
 this.userName = 'ghostwu';
 }
 Person.prototype.showUserName = function(){
 return this.userName;
 }
 function Teacher (){}
 Teacher.prototype = new Person();
 
 var oT = new Teacher();
 console.log( oT instanceof Teacher ); //true
 console.log( oT instanceof Person ); //true
 console.log( oT instanceof Object ); //true
 console.log( Teacher.prototype.isPrototypeOf( oT ) ); //true
 console.log( Person.prototype.isPrototypeOf( oT ) ); //true
 console.log( Object.prototype.isPrototypeOf( oT ) ); //true

四,父類存在的方法和屬性,子類可以覆蓋(重寫),子類沒有的方法和屬性,可以擴展

function Person() {}
 Person.prototype.showUserName = function () {
 console.log('Person::showUserName');
 }
 function Teacher() { }
 Teacher.prototype = new Person();
 Teacher.prototype.showUserName = function(){
 console.log('Teacher::showUserName');
 }
 Teacher.prototype.showAge = function(){
 console.log( 22 );
 }
 var oT = new Teacher();
 oT.showUserName(); //Teacher::showUserName
 oT.showAge(); //22

五、重寫原型對象之后,其實就是把原型對象的__proto__的指向發生了改變

原型對象prototype的__proto__的指向發生了改變,會把原本的繼承關系覆蓋(切斷)

function Person() {}
 Person.prototype.showUserName = function () {
 console.log('Person::showUserName');
 }
 function Teacher() {}
 Teacher.prototype = new Person();
 Teacher.prototype = {
 showAge : function(){
 console.log( 22 );
 }
 }
 var oT = new Teacher();
 oT.showAge(); //22
 oT.showUserName();

上例,第7行,Teacher.prototype重寫了Teacher的原型對象(prototype),原來第6行的原型對象的隱式原型(__proto__)指向就沒有作用了

所以在第14行,oT.showUserName() 就會發生調用錯誤,因為Teacher的原型對象(prototype)的隱式原型(__proto__)不再指向父類(Person)的實例,繼承關系被破壞了.

六、在繼承過程中,小心處理實例的屬性上引用類型的數據

function Person(){
 this.skills = [ 'php', 'javascript' ];
 }
 function Teacher (){}
 Teacher.prototype = new Person();

 var oT1 = new Teacher();
 var oT2 = new Teacher();
 oT1.skills.push( 'linux' );
 console.log( oT2.skills ); //php, java, linux

oT1的skills添加了一項linux數據,其他的實例都能訪問到,因為其他實例享了skills數據,skills是一個引用類型

七、借用構造函數

為了消除引用類型影響不同的實例,可以借用構造函數,把引用類型的數據復制到每個對象上,就不會相互影響了

function Person( uName ){
 this.skills = [ 'php', 'javascript' ];
 this.userName = uName;
 }
 Person.prototype.showUserName = function(){
 return this.userName;
 }
 function Teacher ( uName ){
 Person.call( this, uName );
 }
 var oT1 = new Teacher();
 oT1.skills.push( 'linux' );
 var oT2 = new Teacher();
 console.log( oT2.skills ); //php,javascript
 console.log( oT2.showUserName() );

雖然oT1.skills添加了一項Linux,但是不會影響oT2.skills的數據,通過子類構造函數中call的方式,去借用父類的構造函數,把父類的屬性復制過來,而且還能

傳遞參數,如第8行,但是第15行,方法調用錯誤,因為在構造中只復制了屬性,不會復制到父類原型對象上的方法

八、組合繼承(原型對象+借用構造函數)

經過以上的分析, 單一的原型繼承的缺點有:

1、不能傳遞參數,如,

Teacher.prototype = new Person();
有些人說,小括號后面可以跟參數啊,沒錯,但是只要跟了參數,子類所有的實例屬性,都是跟這個一樣,說白了,還是傳遞不了參數

2、把引用類型放在原型對象上,會在不同實例上產生相互影響

單一的借用構造函數的缺點:

1、不能復制到父類的方法

剛好原型對象方式的缺點,借用構造函數可以彌補,借用構造函數的缺點,原型對象方式可以彌補,于是,就產生了一種組合繼承方法:

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

子類實例oT2的skills不會受到oT1的影響,子類的實例也能調用到父類的方法。

以上這篇[js高手之路]從原型鏈開始圖解繼承到組合繼承的產生詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

[js高手之路]從原型鏈開始圖解繼承到組合繼承的產生詳解

[js高手之路]從原型鏈開始圖解繼承到組合繼承的產生詳解:于javascript原型鏈的層層遞進查找規則,以及原型對象(prototype)的共享特性,實現繼承是非常簡單的事情 一、把父類的實例對象賦給子類的原型對象(prototype),可以實現繼承 function Person(){ this.userName = 'ghostwu'; }
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国语对白一区二区三区 | 婷婷综合在线 | 国产精品久久久久久久久久久久 | 欧美日韩亚洲天堂 | 鸣人x钢手 | 午夜看一级特黄a大片黑 | 欧美日韩综合 | 久久精品免费看 | 亚欧精品一区二区三区 | 国产午夜在线观看 | 国产综合社区 | 国语对白一区二区三区 | 亚洲精品欧美精品 | 欧美日韩黄色大片 | 不卡一区二区在线观看 | 国产成人精品aaaa视频一区 | 91久久精品| 毛片资源 | 亚洲国产欧美视频 | 明星国产欧美日韩在线观看 | 欧美日韩亚洲一区二区 | 欧美第一精品 | 国产性做久久久久久 | 欧美精品日韩 | 欧美高清视频在线观看 | 午夜又黄又爽 | 日韩资源在线 | 国产一级一片免费播放视频 | 韩日免费视频 | 国产精品亚洲精品观看不卡 | 国产成人精品日本亚洲语音2 | 国产一区二区三区久久精品 | 自拍偷拍欧美亚洲 | 欧美曰韩 | 免费黄色在线观看 | 亚洲国产成人精品久久 | 亚洲一区 中文字幕 久久 | 特级全黄一级毛片视频 | 亚洲一区综合 | 精品一区二区免费视频 | 精品国产一区二区三区麻豆小说 |