1. 程式人生 > >關於ES5中的prototype與ES6中class繼承的比較

關於ES5中的prototype與ES6中class繼承的比較

ES5:

繼承:

1.通過原型鏈實現繼承。子類的prototype為父類物件的一個例項,因此子類的原型物件包含指向父類的原型物件的指標,父類的例項屬性成為子類原型屬性

2.ES5 的繼承,實質是先創造子類的例項物件this,然後再將父類的方法新增到this上面(Parent.apply(this)

ES6:

繼承:

1.子類沒有自己的this物件,因此必須在construct中通過super繼承父類的this物件,而後對此this物件進行加工。super關鍵字在建構函式中表示父類的建構函式,用來新建父類的this物件。

2.ES6 的繼承機制完全不同,實質是先創造父類的例項物件this(所以必須先呼叫super

方法),然後再用子類的建構函式修改this

3.super可作為函式和物件使用。當作為函式使用時,只可在子類的建構函式中使用,表示父類的建構函式,但是super中的this指向的是子類的例項,因此在子類中super()表示的是Parent.prototype.constructor.call(this)。當作為物件使用時,super表示父類原型物件,即Parent.prototype。

類的prototype屬性及_proto_屬性:

每個構造器都有一個prototype屬性,該屬性在定義構造器方法時自動建立的,prototype屬性代表用該函式建立的類的屬性值,如果將方法分配給類的prototype屬性,則該類的任何新建立的例項都可以使用這些方法。

類的每個新例項也都有一個__proto__屬性(注意前後分別是兩個下劃線),用於引用建立它的構造器的prototype屬性。也就是說__proto__屬性最終還是要經過對prototype屬性的引用才能實現其功能,而且IE不支援使用__proto__屬性,所以不建議使用該屬性。