鍍金池/ 問答/HTML/ js經(jīng)典繼承中,為什么使用的是借用構(gòu)造函數(shù),而不是直接使用構(gòu)造函數(shù)?

js經(jīng)典繼承中,為什么使用的是借用構(gòu)造函數(shù),而不是直接使用構(gòu)造函數(shù)?

如題,最近在翻紅寶書的時候發(fā)現(xiàn)了一個疑惑的問題。
在6.3繼承的篇章中提到了組合繼承,其解釋如下:

clipboard.png

而后還有一段補充其在js中的地位為最常用的繼承模式:

clipboard.png

那么問題來了,原型鏈,構(gòu)造函數(shù)大家估計都知道是什么,那么借用構(gòu)造函數(shù)呢?

那么給出一段借用構(gòu)造函數(shù)的例子:

function SuperType(){
    this.colors = ["red", "blue", "green"];
} 
 
function SubType(){
    //繼承了 SuperType 
    SuperType.call(this);
} 
 
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"

而使我感到疑惑的便是為何是借用構(gòu)造函數(shù),如上面代碼中,父類中調(diào)用超類給子類添加子類私有的屬性。
為什么這個不能使用構(gòu)造函數(shù)做呢?
明明構(gòu)造函數(shù)一樣可以實現(xiàn),并且構(gòu)造函數(shù)比借用構(gòu)造函數(shù)結(jié)構(gòu)還要簡單點。
改為構(gòu)造函數(shù)的例子,效用與借用構(gòu)造函數(shù)是一樣的:

function SubType() {
  this.colors = ["red", "blue", "green"];
}

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"

所以我再強調(diào)一下我的問題:為什么組合繼承中要使用借用構(gòu)造函數(shù),而不是直接使用構(gòu)造函數(shù)?在我看來構(gòu)造函數(shù)比借用構(gòu)造函數(shù)簡單,并且功能一致。

回答
編輯回答
不討喜

兩者獨立還叫什么繼承
如果改動 父類中的東西 比如刪除red字段 直接使用構(gòu)造函數(shù)的子類 兩者是沒有關(guān)系的

function SuperType(){
    this.colors = ["red", "blue", "green"];
} 
 
function SubType1(){
    //繼承了 SuperType 
    SuperType.call(this);
    this.colors.push("black")
}
function SubType2(){
    //繼承了 SuperType 
    SuperType.call(this);
    this.colors.push("white")
}

如果有一天修改colors 刪除red 那么只需修改父類:

function SuperType(){
    this.colors = ["blue", "green"];
}

如果都是獨立的 那有100個子類 就要修改100

2018年3月14日 10:48
編輯回答
紓惘

不不,組合繼承和構(gòu)造函數(shù)根本就是兩個概念,一個是為了繼承,一個單純只是為了實例化,概念都不一樣。
組合繼承為什么要使用借用構(gòu)造函數(shù)?因為如果都是用原型鏈繼承,當我更子類上繼承于父類的屬性,特別是引用屬性的時候,也會連同父類上的那個屬性一起修改了,引起誤操作。
如果都是用借用構(gòu)造函數(shù),由于借用構(gòu)造函數(shù)繼承的屬性,只是基于父類的屬性的拷貝,跟父類沒有任何聯(lián)系,所以當你需要更改某個使用借用構(gòu)造函數(shù)繼承的屬性的時候,會發(fā)現(xiàn)只是更改父類并不起效果,要全部修改,有多少子類你就要去修改多少次。此外,如果全部使用借用構(gòu)造函數(shù),當父類方法屬性較多時,會造成不必要的內(nèi)存開銷。

2017年1月12日 02:17