這是 最近在學習js繼承時看了多篇文章以及自我總結的學習筆記。
目錄:
一:原型鏈
二:構造函數
三:原型鏈和構造函數組合繼承
四:原型式
五:寄生式
六:寄生組合式
function Super(){ this.name = "lily"; this.age = 21; this.arr = [1,2,3] } function Sub(){} Sub.prototype = new Super();//核心 拿父類實例來充當子類原型對象 var l1 = new Sub(); var l2 = new Sub(); l1.name = "gan"; l1.arr.push(4) l(l1.name)//"gan" l(l2.name)//"lily" l(l1.arr)//[1, 2, 3, 4] l(l2.arr)//[1, 2, 3, 4]
優點:easy
缺點: 1,原型對象的引用屬性是所有實例共享的, l2.arr跟著 l1.arr一起變化
function Super(name,age){ this.name = name; this.age = age; this.arr = [1,2,3]; this.foo = function(){ //.. } } function Sub(name,age){ Super.call(this,[name,age])//核心 在子類型構造函數中調用超類型構造函數 } var l1 = new Sub("lily",21); var l2 = new Sub("gan",22); l1.arr.push(4) l(l1.name)//["lily", 21] l(l2.name)//["gan", 22] l(l1.arr)//[1, 2, 3, 4] l(l2.arr)//[1, 2, 3] l(l1.foo === l2.foo)//false
優點: 解決了子類實例共享父類引用屬性的問題 可傳參
缺點:方法都在構造函數中定義,浪費內存還不能復用。在超類型的原型中定義的方法對子類型而言不可見:
Super.prototype.sayName = function(){ l(this.name) } l(l1.sayName)//undefined3,組合式(最常用)
function Super(name){ this.name = name; this.age = 21; this.arr = [1,2,3]; } Super.prototype.sayName = function(){ return this.name } function Sub(name){ Super.call(this,name)//核心 } Sub.prototype = new Super();//核心 Sub.prototype.constructor = Sub; var l1 = new Sub("lily"); l(l1.sayName())//lily
優點:從已有對象衍生新對象,不需要創建自定義類型(更像是對象復制,而不是繼承)
缺點:原型引用屬性會被所有實例共享,因為是用整個父類對象來充當了子類原型對象,所以這個缺陷無可避免;無法實現代碼復用
function object(o){ function F(){} F.prototype = o; return new F(); } function Super(){ this.name = "lily"; this.age = 21; this.arr = [1,2,3,4] } Super.prototype.sayName = function(){ return this.name } var Sub = new Super(); l(Sub)//Super {name: "lily", age: 21} var sup = object(Sub) l(sup)//F {__proto__: Super}得到一個“純潔”的新對象(“純潔”是因為沒有實例屬性),再逐步增強之(填充實例屬性) sup.sex = "girl" l(sup)//F {sex: "girl",__proto__: Super} l(sup.arr) //[1,2,3,4] l(sup1.arr)//[1,2,3,4]
優點:從已有對象衍生新對象,不需要創建自定義類型(更像是對象復制,而不是繼承)
缺點:原型引用屬性會被所有實例共享,因為是用整個父類對象來充當了子類原型對象,所以這個缺陷無可避免;無法實現代碼復用
function object(o){ function F(){} F.prototype = o; return new F(); } function Super(){ this.name = "lily"; this.age = 21; this.arr = [1,2,3,4] } Super.prototype.sayName = function(){ return this.name } function getSubObject(obj){ // 創建新對象 var clone = object(obj); // 核心 // 增強 clone.attr1 = 1; clone.attr2 = 2; //clone.attr3... return clone; } var Sub = getSubObject(new Super()); l(Sub)//Super {name: "lily", age: 21} var sup = object(Sub) var sup1 = object(Sub) l(sup)//F {__proto__: Super}得到一個“純潔”的新對象(“純潔”是因為沒有實例屬性),再逐步增強之(填充實例屬性) l(sup.arr) l(sup1.arr)6,寄生組合式
function object(o){ function F(){} F.prototype = o; return new F(); } function Super(){ this.name = "lily"; this.age = 21; this.arr = [1,2,3,4] } Super.prototype.sayName = function(){ return this.name } function Sub(){ Super.call(this) } var proto = object(Super.prototype); // 核心 proto.constructor = Sub; // 核心 Sub.prototype = proto; // 核心 var sub = new Sub(); l(sub.name); l(sub.arr);
用object(Super.prototype);切掉了原型對象上多余的那份父類實例屬性
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86624.html
摘要:組合繼承也是需要修復構造函數指向的這種方式融合原型鏈繼承和構造函數的優點,是中最常用的繼承模式。的繼承機制完全不同,實質是先將父類實例對象的屬性和方法,加到上面所以必須先調用方法,然后再用子類的構造函數修改。 前言 面向對象編程很重要的一個方面,就是對象的繼承。A 對象通過繼承 B 對象,就能直接擁有 B 對象的所有屬性和方法。這對于代碼的復用是非常有用的。 大部分面向對象的編程語言,...
摘要:組合繼承也是需要修復構造函數指向的這種方式融合原型鏈繼承和構造函數的優點,是中最常用的繼承模式。的繼承機制完全不同,實質是先將父類實例對象的屬性和方法,加到上面所以必須先調用方法,然后再用子類的構造函數修改。 前言 面向對象編程很重要的一個方面,就是對象的繼承。A 對象通過繼承 B 對象,就能直接擁有 B 對象的所有屬性和方法。這對于代碼的復用是非常有用的。 大部分面向對象的編程語言,...
摘要:組合繼承也是需要修復構造函數指向的這種方式融合原型鏈繼承和構造函數的優點,是中最常用的繼承模式。的繼承機制完全不同,實質是先將父類實例對象的屬性和方法,加到上面所以必須先調用方法,然后再用子類的構造函數修改。 前言 面向對象編程很重要的一個方面,就是對象的繼承。A 對象通過繼承 B 對象,就能直接擁有 B 對象的所有屬性和方法。這對于代碼的復用是非常有用的。 大部分面向對象的編程語言,...
摘要:組合繼承也是需要修復構造函數指向的這種方式融合原型鏈繼承和構造函數的優點,是中最常用的繼承模式。的繼承機制完全不同,實質是先將父類實例對象的屬性和方法,加到上面所以必須先調用方法,然后再用子類的構造函數修改。 前言 面向對象編程很重要的一個方面,就是對象的繼承。A 對象通過繼承 B 對象,就能直接擁有 B 對象的所有屬性和方法。這對于代碼的復用是非常有用的。 大部分面向對象的編程語言,...
摘要:數據類型數據類型指的就是字面量類型在中一共有六種數據類型字符串數值布爾值空值未定義對象其中屬于基本數據類型而屬于引用數據類型字符串在中使用字符串需要使用引號括起來使用雙引號或單引號都可以不能混合使用引號不能嵌套數值型在中所有數值類型都 ?? ? ? ???????????????????? ???????數據類型 數據類型指的就是字面量類型 在JS中一共有六種數據類型 ...
閱讀 1130·2023-04-26 02:46
閱讀 632·2023-04-25 19:38
閱讀 644·2021-10-14 09:42
閱讀 1242·2021-09-08 09:36
閱讀 1359·2019-08-30 15:44
閱讀 1323·2019-08-29 17:23
閱讀 2243·2019-08-29 15:27
閱讀 807·2019-08-29 14:15