淺談JS繼承_寄生式繼承 & 寄生組合式繼承
5.寄生式繼承
與寄生構(gòu)造函數(shù)和工廠模式類似,創(chuàng)建一個僅用于封裝繼承過程的函數(shù),該函數(shù)在內(nèi)部以某種方式來增強對象,最后返回對象。
function createAnother(original){ var clone = Object.create(original); //通過調(diào)用函數(shù)創(chuàng)建一個新對象 clone.sayHi = function(){ //以某種方式來增強這個對象 alert("Hi"); }; return clone; //返回這個對象 } var person = { name: "Bob", friends: ["Shelby", "Court", "Van"] }; var anotherPerson = createAnother(person); anotherPerson.sayHi();
在上述例子中,createAnother函數(shù)接收了一個參數(shù),也就是將要作為新對象基礎(chǔ)的對象。
anotherPerson是基于person創(chuàng)建的一個新對象,新對象不僅具有person的所有屬性和方法,還有自己的sayHi()方法。
6.寄生組合式繼承
組合繼承是js最常用的繼承模式,組合繼承最大的問題就是無論在什么情況下,都會調(diào)用兩次構(gòu)造函數(shù):一次是在創(chuàng)建子類型原型時,另一次是在子類型構(gòu)造函數(shù)內(nèi)部。
function SuperType(name){ this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function(){ alert(this.name); } function SubType(name, age){ SuperType.call(this, name); //第二次調(diào)用SuperType() this.age = age; } SubType.prototype = new SuperType(); //第一次調(diào)用SuperType() SubType.prototype.sayAge = function(){ alert(this.age); }
在第一次調(diào)用SuperType構(gòu)造函數(shù)時,SubType.prototype會得到兩個屬性: name和colors; 他們都是SuperType的實例屬性,只不過現(xiàn)在位于SubType的原型中。
當(dāng)調(diào)用SubType構(gòu)造函數(shù)時,又會調(diào)用一次SuperType構(gòu)造函數(shù),這一次又在新對象上創(chuàng)建了實例屬性name和colors。
于是這兩個屬性就屏蔽了原型中的兩個同名屬性。
寄生組合式繼承就是為了解決這一問題。
通過借用構(gòu)造函數(shù)來繼承屬性;
通過原型鏈來繼承方法。
不必為了指定子類型的原型而調(diào)用超類型的構(gòu)造函數(shù),
function inheritPrototype(subType, superType){ var protoType = Object.create(superType.prototype); //創(chuàng)建對象 protoType.constructor = subType; //增強對象 subType.prototype = protoType; //指定對象 } function SuperType(name){ this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function(){ alert(this.name); } function SubType(name, age){ SuperType.call(this, name); //第二次調(diào)用SuperType() this.age = age; } inheritPrototype(SubType, SuperType) SubType.prototype.sayAge = function(){ alert(this.age); } var instance = new SubType("Bob", 18); instance.sayName(); instance.sayAge();
inheritPrototype函數(shù)接收兩個參數(shù):子類型構(gòu)造函數(shù)和超類型構(gòu)造函數(shù)。
1. 創(chuàng)建超類型原型的副本。
2. 為創(chuàng)建的副本添加constructor屬性,彌補因重寫原型而失去的默認(rèn)的constructor屬性
3. 將新創(chuàng)建的對象(即副本)賦值給子類型的原型這種方法只調(diào)用了一次SuperType構(gòu)造函數(shù),instanceof 和isPrototypeOf()也能正常使用。
以上這篇淺談JS繼承_寄生式繼承 & 寄生組合式繼承就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
bootstrap實現(xiàn)的自適應(yīng)頁面簡單應(yīng)用示例
這篇文章主要介紹了bootstrap實現(xiàn)的自適應(yīng)頁面簡單應(yīng)用,結(jié)合具體實例形式分析了基于bootstrap的列表布局結(jié)構(gòu)頁面實現(xiàn)與使用技巧,需要的朋友可以參考下2017-03-03淺談JavaScript構(gòu)造樹形結(jié)構(gòu)的一種高效算法
這篇文章主要介紹了JavaScript構(gòu)造樹形結(jié)構(gòu)的一種高效算法,對算法感興趣的同學(xué),可以參考下2021-05-05javascript數(shù)字?jǐn)?shù)組去重復(fù)項的實現(xiàn)代碼
console.log 不支持ie,下面的代碼需要在火狐中測試,不然會有問題。2010-12-12javascript實現(xiàn)tab響應(yīng)式切換特效
這篇文章主要為大家介紹了javascript實現(xiàn)tab響應(yīng)式切換特效,以一個完整的實例對tab響應(yīng)式切換特效進行詳細(xì)的分析,感興趣的小伙伴們可以參考一下2016-01-01