簡體   English   中英

派生類究竟從其基類繼承了什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM