[英]What exactly does a derived class inherit from its base class?
我目前正在為 Javascript 學習 ES6 類,我似乎理解它們的概念,但我不明白派生類從其基類繼承了什么。 是類的方法嗎? 假設一個類的方法是該類的屬性是否安全? 在這種情況下,它們是原型的一部分,因此被原型鏈中的對象繼承。 那么構造函數呢? 構造函數中定義的屬性是否被繼承?
謝謝您的考慮!
類或多或少只是用於設置原型繼承的語法糖。
class Derived extends Base {}
相當於
function Derived(...args) {
return Base.apply(this, args);
}
Object.setPrototypeOf(Derived, Base);
Object.setPrototypeOf(Derived.prototype, Base.prototype);
super
和未來的公共和私有類字段有一些“魔法”,但對象之間的基本關系是相同的。
假設一個類的方法是該類的屬性是否安全? 在這種情況下,它們是原型的一部分,因此被原型鏈中的對象繼承。
是的,方法成為相應prototype
對象的屬性,所有實例都從中繼承。 IE
class Foo {
bar() {}
}
相當於
function Foo() {}
Foo.prototype.bar = function() {}
並且由於“基類” property
對象位於派生類的原型鏈中,因此其所有方法都可用於派生類的實例。
構造函數中定義的屬性是否被繼承?
“繼承”在這里是錯誤的詞。 屬性是在實例本身上創建的,因為這是構造函數的工作方式。
考慮這個過程是這樣的:
// Create new instance
var newInstance = Object.create(Derived.prototype);
// Call base constructor with `this` set to new instance
Base.apply(newInstance);
// Call derived constructor with `this` set to new instance
Derived.apply(newInstance);
如果基礎構造函數包含類似this.base = 42;
,那么該屬性將直接在新實例上創建,因為this
指的是新實例。
注意:實際上,由於擴展內置類(例如Array
需要特殊處理,因此確切的流程略有不同,但最終結果大致相同。
您沒有詢問static
方法,但這些仍然是繼承的一部分。 static
方法成為構造函數本身的屬性。
class Foo {
static bar() {}
}
相當於
function Foo() {}
Foo.bar = function() {}
因為基類的構造函數成為派生類構造函數的原型,所以在基構造函數上定義的所有屬性都對派生構造函數可用。
您瀏覽器中的開發人員工具實際上可以向您展示所有這些:
class Base { static staticBase() {} constructor() { this.base = 42; } fromBase() {} } class Derived extends Base { static staticDervied() {} constructor() { super(); // necessary since we extend base this.derived = 21; } fromDerived() {} } console.dir(Derived); console.dir(new Derived());
有很多關於基本 es06 示例的重要資源 - https://exploringjs.com/es6/ch_classes.html#details-of-subclassing
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.