基本思想就是 : 利用原型讓乙個引用型別繼承另乙個引用型別的屬性和方法
function supertype()
supertype.prototype.getsupervalue = function();
function subtype()
//繼承了 supertype
subtype.prototype = new supertype(); //這句話關鍵
subtype.prototype.getsubvalue = function ()
var instance1 = new subtype();
instance1.colors.push("black");
alert(instance1.colors); //"red,blue,green,black"
var instance2 = new subtype();
alert(instance2.colors); //"red,blue,green"
優點:子型別建構函式中向超型別構造函 數傳遞引數
缺點:也將無法避免建構函式模式存在的問題——方法都在建構函式中定 義,因此函式復用就無從談起了
思路 :使用原型鏈實現對原型屬性和方 法的繼承,而通過借用建構函式來實現對例項屬性的繼承
function supertype(name)
supertype.prototype.sayname = function();
function subtype(name, age)
//繼承方法
subtype.prototype = new supertype();
subtype.prototype.constructor = subtype;
subtype.prototype.sayage = function();
var instance1 = new subtype("nicholas", 29);
instance1.colors.push("black");
alert(instance1.colors);
instance1.sayname();
instance1.sayage();
//"red,blue,green,black"
//"nicholas";
//29
var instance2 = new subtype("greg", 27);
alert(instance2.colors);
instance2.sayname();
instance2.sayage();
//"red,blue,green"
//"greg";
//27
組合繼承避免了原型鏈和借用建構函式的缺陷,融合了它們的優點
組合繼承最大的 問題就是無論什麼情況下,都會呼叫兩次超型別建構函式
借助原型可以基於已有的物件建立新物件,同時還不必因此建立自定義型別。
function object(o)
f.prototype = o;
return new f();
}
借助上邊這個函式:
在 object()函式內部,先建立了乙個臨時性的建構函式,然後將傳入的物件作為這個建構函式的 原型,最後返回了這個臨時型別的乙個新例項
var person = ;
var anotherperson = object(person); //這句話關鍵
anotherperson.name = "greg";
anotherperson.friends.push("rob");
var yetanotherperson = object(person); //這句話也可以替換為 object.create(person)
yetanotherperson.name = "linda";
yetanotherperson.friends.push("barbie");
alert(person.friends); //"shelby,court,van,rob,barbie"
缺點:包含引用型別值的屬性始終都會共享相應的值,就像使用原型模式一樣。
寄生式繼承的思路與寄生建構函式和工廠模式類似,即建立乙個僅用於封裝繼承過程的函式,該 函式在內部以某種方式來增強物件,最後再像真地是它做了所有工作一樣返回物件。
function createanother(original);
return clone; //返回這個物件
var person = ;
var anotherperson = createanother(person);
anotherperson.sayhi(); //"hi"
缺點:使用寄生式繼承來為物件新增函式,會由於不能做到函式復用而降低效率;這一 點與建構函式模式類似。
所謂寄生組合式繼承,即通過借用建構函式來繼承屬性,通過原型鏈的混成形式來繼承方法。
其背後的基本思路是:不必為了指定子型別的原型而呼叫超型別的建構函式,我們所需要的無非就是超型別 原型的乙個副本而已。本質上,就是使用寄生式繼承來繼承超型別的原型,然後再將結果指定給子型別 的原型
function inheritprototype(subtype, supertype)
function supertype(name)
supertype.prototype.sayname = function();
function subtype(name, age)
inheritprototype(subtype, supertype);//關鍵
subtype.prototype.sayage = function()
這個例子的高效率體現在它只呼叫了一次 supertype 建構函式,並且因此避免了在 subtype. prototype 上面建立不必要的、多餘的屬性。與此同時,原型鏈還能保持不變;因此,還能夠正常使用 instanceof 和 isprototypeof()。開發人員普遍認為寄生組合式繼承是引用型別最理想的繼承正規化。 js實現繼承的六種方式
原型鏈利用原型讓乙個引用型別繼承另外乙個引用型別的屬性和方法。建構函式,原型,例項之間的關係 每個建構函式都有乙個原型物件,原型物件包含乙個指向建構函式的指標,而例項都包含乙個指向原型物件的內部指標。原型鏈實現繼承例子 function supertype supertype.prototype.g...
js 實現繼承的六種方式
原型鏈 利用原型讓乙個引用型別繼承另外乙個引用型別的屬性和方法。建構函式,原型,例項之間的關係 每個建構函式都有乙個原型物件,原型物件包含乙個指向建構函式的指標,而例項都包含乙個指向原型物件的內部指標。原型鏈實現繼承例子 function supertype supertype.prototype....
js實現繼承的六種方式
原型鏈利用原型讓乙個引用型別繼承另外乙個引用型別的屬性和方法。建構函式,原型,例項之間的關係 每個建構函式都有乙個原型物件,原型物件包含乙個指向建構函式的指標,而例項都包含乙個指向原型物件的內部指標。原型鏈實現繼承例子 function supertype supertype.prototype.g...