91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS繼承、工廠構造及原型設計模式實例分析

發布時間:2022-07-08 10:13:38 來源:億速云 閱讀:133 作者:iii 欄目:開發技術

這篇文章主要介紹“JS繼承、工廠構造及原型設計模式實例分析”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“JS繼承、工廠構造及原型設計模式實例分析”文章能幫助大家解決問題。

正文

正是由于:原型鏈繼承和構造函數繼承的 “毛病”

  • 原型鏈繼承:所有繼承的屬性和方法都會在對象實例間共享,無法做到實例私有。

  • 構造函數繼承:子類不能訪問父類原型上的方法。

組合繼承應運而生:

function SuperType(name){
     this.name = name;
     this.colors = ["red", "blue", "green"];
}
function SubType(name, age){
     SuperType.call(this, name) // 構造函數繼承 (兩次調用父類構造函數)
     this.age = age;
}
SuperType.prototype.sayName = function() {
     console.log(this.name);
}
SubType.prototype = new SuperType() // 原型鏈繼承 (一次調用父類構造函數)
SubType.prototype.sayAge = function() {
	 console.log(this.age);
}
let s1 = new SubType("Nicholas", 29)
let s2= new SubType("Greg", 27)
s1.colors.push("yellow")
console.log(s1.colors) // ['red', 'blue', 'green', 'yellow']
console.log(s2.colors) // ['red', 'blue', 'green']
s1.sayName() // Nicholas
s2.sayName() // Greg
s1.sayAge() // 29
s2.sayAge() // 27

但是呢?這樣做,會有效率問題,父類構造函數始終會被調用兩次:一次是在子類構造函數中調用,另一次在是創建子類原型時調用。

本質上,子類原型最終是要包含超類對象的所有實例屬性,子類構造函數只要在執行時重寫自己的原型就行了。

這個時候有一個新的思路!

不通過調用父類構造函數給子類原型賦值,而是取得父類原型的一個副本。使用寄生式繼承來繼承父 類原型,然后將返回的新對象賦值給子類原型。

核心代碼是:通過工廠的方式,增強一個新對象:

function createAnother(original){
     let clone = Object(original); // 通過調用函數創建一個新對象
     clone.sayHi = function() { // 以某種方式增強這個對象
         console.log("hi");
     };
     return clone; // 返回這個對象
}

將組合代碼改造一下,完整代碼是:

function inheritPrototype(subType, superType) {
     let prototype = Object(superType.prototype); // 創建對象
     prototype.constructor = subType; // 增強對象
     subType.prototype = prototype; // 賦值對象
}
function SuperType(name) {
     this.name = name;
     this.colors = ["red", "blue", "green"];
}
function SubType(name, age) {
     SuperType.call(this, name); // 構造函數繼承(只調了一次)
     this.age = age;
}
SuperType.prototype.sayName = function() {
     console.log(this.name);
};
inheritPrototype(SubType, SuperType); // 寄生繼承
SubType.prototype.sayAge = function() {
     console.log(this.age);
};
let s1 = new SubType("Nicholas", 29)
let s2= new SubType("Greg", 27)
s1.colors.push("yellow")
console.log(s1.colors) // ['red', 'blue', 'green', 'yellow']
console.log(s2.colors) // ['red', 'blue', 'green']
s1.sayName() // Nicholas
s2.sayName() // Greg
s1.sayAge() // 29
s2.sayAge() // 27

這里只調用了一次 SuperType 構造函數,避免了 SubType.prototype 上不必要也用不到的屬性;而且,原型鏈仍然保持不變,instanceof 操作符和 isPrototypeOf() 方法正常有效。

寄生式組合繼承可以算是【引用類型】繼承的最佳模式

os:不過這里的增強寫法,理解起來真是怪,為什么父類的顯示原型的構造函數等于子類?

SuperType.prototype.constructor=== SubType // true

大概是為了,通過寄生實現:父類、子類都由同一函數構造;

SubType === SubType.prototype.constructor // true
SuperType.prototype.constructor === SubType.prototype.constructor // true

關于“JS繼承、工廠構造及原型設計模式實例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

合阳县| 武鸣县| 元阳县| 柳河县| 焦作市| 鄂托克前旗| 饶阳县| 华蓥市| 凭祥市| 天祝| 镇安县| 都江堰市| 建昌县| 九江县| 筠连县| 黄平县| 迁安市| 棋牌| 朔州市| 木兰县| 渝中区| 永登县| 麦盖提县| 清水河县| 襄汾县| 沙田区| 冕宁县| 宁海县| 龙游县| 通道| 镇远县| 枣庄市| 平乡县| 若羌县| 年辖:市辖区| 柞水县| 海伦市| 高碑店市| 始兴县| 拉孜县| 清流县|