摘要:前提組合指的是什么就是這兩部分的組合構造函數(shù)屬性的繼承和建立子類和父類原型的鏈接。與此同時,原型鏈還能保持不變開發(fā)人員普遍認為寄生組合式繼承是引用類型最理想的繼承方式
前提: 組合指的是什么?就是這兩部分的組合:構造函數(shù)屬性的繼承和建立子類和父類原型的鏈接。
借用構造函數(shù)繼承
最簡單的方法,使用call或apply方法,將父對象的構造函數(shù)綁定在子對象上
function Super(name){ this.name=name; this.friends = ["小紅","小強"]; } Super.prototype.sayName = function(){ alert(this.name) }; function Sub(name){ Super.apply(this,arguments); } var instance1 = new Sub("小明"); var instance2 = new Sub("小明"); instance1.friends.push("張三"); console.log(instance1.friends);//["小紅", "小強", "張三"] console.log(instance2.friends);//["小紅", "小強"]
缺點: 沒辦法繼承超類中的原型屬性和方法
原型鏈繼承
function Super(){ this.name="小明"; } Super.prototype.sayName = function(){ alert(this.name) }; function Sub(){} Sub.prototype = new Super(); Sub.prototype.constructor = Sub; //此句的作用是為了不讓繼承鏈的紊亂,因為任何一個prototype對象都有一個constructor屬性,指向它的構造函數(shù), //并且每一個實例也有一個constructor屬性,默認調用prototype對象的constructor屬性, //所以new Animal()的constructor指向Super,導致Sub.prototype.constructor改而指向了Super 為了不導致紊亂 所以要手動指回 var instance = new Sub(); instance.sayName();//小明
缺點:
1.當父類中包含引用類型屬性值時,其中一個子類的多個實例中,只要其中一個實例引用屬性只發(fā)生修改一個修改,其他實例的引用類型屬性值也會立即發(fā)生改變
2.原因是父類的屬性變成子類的原型屬性
組合式繼承
(原型繼承+借用構造函數(shù)繼承)
function Super(){ this.name="小明"; this.friends = ["小紅","小強"]; } Super.prototype.sayName = function(){ alert(this.name) }; function Sub(){ Super.call(this); } Sub.prototype = new Super(); var instance1 = new Sub(); var instance2 = new Sub(); instance1.friends.push("張三"); console.log(instance1.friends);//["小紅", "小強", "張三"] console.log(instance2.friends);//["小紅", "小強"] instance1.sayName();//小明 instance2.sayName();//小明
缺點:
1.兩次調用父構造函數(shù) 并且子類的自由屬性和原型鏈上的屬性會重復覆蓋 (打印instance1對象 instance1.prototype和instance1都有一個name屬性)
2.同原型鏈繼承的第一個缺點
寄生組合式繼承
寄生組合式繼承 兩步:
1.在子類中調用父類的構造函數(shù): Super.apply(this,arguments) 2.建立子類和父類原型的鏈接 最簡單的方法就是用Object.create()方法對父類的原型進行淺復制,賦給子類原型: Sub.prototype=Object.create(Super.prototype); //相比之前的原型鏈繼承方法:SubType.prototype=new SuperType();這里沒有創(chuàng)建構造函數(shù);
//寄生組合式繼承函數(shù) function inheritPrototype(sub,super){ var prototype=Object.create(super.prototype) prototype.constructor = sub; //增強對象 sub.prototype = prototype; //最后指定對象 } //最終的實現(xiàn)方法 function Super(name){ this.name=name; } Super.prototype.sayName=function(){console.log(this.name)} function Sub(name,age){ Super.call(this,name); this.age=age; } inheritPrototype(SubType,SuperType); //實現(xiàn)繼承 //其實,說白了寄生組合式繼承就是一個借用構造函數(shù) + 相當于淺拷貝父類的原型對象
這種方式的高效率體現(xiàn)它只調用了一次Parent構造函數(shù),并不會創(chuàng)建不必要的、多余的屬性。與此同時,原型鏈還能保持不變;開發(fā)人員普遍認為寄生組合式繼承是引用類型最理想的繼承方式.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/97408.html
摘要:避免脆弱的基類問題。紅牌警告沒有提到上述任何問題。單向數(shù)據(jù)流意味著模型是單一的事實來源。單向數(shù)據(jù)流是確定性的,而雙向綁定可能導致更難以遵循和理解的副作用。原文地址 1. 你能說出兩種對 JavaScript 應用開發(fā)者而言的編程范式嗎? 希望聽到: 2. 什么是函數(shù)編程? 希望聽到: 3. 類繼承和原型繼承的不同? 希望聽到 4. 函數(shù)式編程和面向對象編程的優(yōu)缺點? ...
摘要:繼承簡介在的中的面向對象編程,繼承是給構造函數(shù)之間建立關系非常重要的方式,根據(jù)原型鏈的特點,其實繼承就是更改原本默認的原型鏈,形成新的原型鏈的過程。 showImg(https://segmentfault.com/img/remote/1460000018998684); 閱讀原文 前言 JavaScript 原本不是純粹的 OOP 語言,因為在 ES5 規(guī)范中沒有類的概念,在 ...
摘要:深入之繼承的多種方式和優(yōu)缺點深入系列第十五篇,講解各種繼承方式和優(yōu)缺點。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點 JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:使用異步編程,有一個事件循環(huán)。它作為面向對象編程的替代方案,其中應用狀態(tài)通常與對象中的方法搭配并共享。在用面向對象編程時遇到不同的組件競爭相同的資源的時候,更是如此。 翻譯:瘋狂的技術宅原文:https://www.indeed.com/hire/i... 本文首發(fā)微信公眾號:jingchengyideng歡迎關注,每天都給你推送新鮮的前端技術文章 不管你是面試官還是求職者,里面...
摘要:前言作為中最重要的內容之一,繼承問題一直是我們關注的重點。如果一個類別繼承自另一個類別,就把這個稱為的子類,而把稱為的父類別也可以稱是的超類。 前言 作為 JavaScript 中最重要的內容之一,繼承問題一直是我們關注的重點。那么你是否清晰地知道它的原理以及各種實現(xiàn)方式呢 閱讀這篇文章,你將知道: 什么是繼承 實現(xiàn)繼承有哪幾種方式 它們各有什么特點 這里默認你已經清楚的知道構造函...
閱讀 699·2021-11-22 09:34
閱讀 3833·2021-09-22 15:42
閱讀 1343·2021-09-03 10:28
閱讀 1084·2021-08-26 14:13
閱讀 1912·2019-08-29 15:41
閱讀 1440·2019-08-29 14:12
閱讀 3376·2019-08-26 18:36
閱讀 3320·2019-08-26 13:47