組合式繼承:
function Person3(params) {
// 私有屬性定義
}
// 復(fù)用方法定義
Person3.prototype.fn = function() {
// todo
}
function Man3(params) {
// 借用構(gòu)造函數(shù)繼承父類型實(shí)例屬性
Person3.call(this, params); // 第二次調(diào)用
// 增加對(duì)象等
}
// 原型鏈繼承父類型的原型屬性和方法
Man3.prototype = new Person(); // 第一次調(diào)用
var man3 = new Man3()
組合繼承的缺點(diǎn):會(huì)調(diào)用兩次父類型構(gòu)造函數(shù),在子類型的原型上創(chuàng)造了不必要的桐玻、多余的屬性
寄生組合式繼承:為了解決組合繼承的缺陷
所謂寄生組合式繼承篙挽,即通過借用構(gòu)造函數(shù)
來繼承屬性
,通過原型鏈
繼承方法
。
它的基本思路:不必為了指定子類型的原型而調(diào)用父類型的構(gòu)造函數(shù)镊靴,我們所需要的僅僅是父類型的原型的一個(gè)副本
铣卡。本質(zhì)上,使用寄生式繼承來繼承父類型的原型
邑闲,再將結(jié)果指定給子類型的原型
算行。
代碼實(shí)現(xiàn):
function Person6(params) {
// 私有屬性定義
}
// 復(fù)用方法定義
Person6.prototype.fn = function() {
// todo
}
function Man6 (params) {
// 借用構(gòu)造函數(shù)來繼承屬性
Person6.call(this, params);
// 聲明自己的私有屬性
}
function inheritPrototype(child, parent) {
var clone = object(parent.prototype); // 創(chuàng)建對(duì)象
clone.constructor = child; // 增強(qiáng)對(duì)象
child.prototype = clone; // 指定對(duì)象
}
inheritPrototype(Man6, Person6);
// 子類型定義復(fù)用方法
Man6.prototype.fn = function() {
// todo
}
寄生組合式繼承只調(diào)用了一次父類型構(gòu)造函數(shù),因此避免了在子類型的原型上創(chuàng)建不必要的屬性苫耸。它沒有原型鏈繼承州邢、原型式繼承存在的引用類型值的原型屬性共享問題、子類型實(shí)例對(duì)象到父類型構(gòu)造函數(shù)的傳參問題褪子,也沒有借用構(gòu)造函數(shù)存在的函數(shù)不復(fù)用問題量淌、父類型的原型方法對(duì)子類型不可見問題,沒有組合繼承存在的子類型原型會(huì)創(chuàng)建不必要的屬性問題嫌褪,沒有寄生式繼承存在的函數(shù)不復(fù)用問題呀枢。