我在寫代碼時遇到了這個我無法理解的場景。
該場景如下。我有一個來自一個庫的類,我正在擴展它。 這個類是 "父 "類。它允許它的子類覆寫 init 方法,以便進行自定義初始化。
然而,第二個子類的行為并不像我所期望的那樣。這兩個類的唯一區別是成員變數的宣告(?在撰寫純 JS 時,我甚至不會考慮這樣做,但我是用 Typescript 撰寫的,這就是編譯后的結果(實際上,在我的特定情況下,我甚至沒有賦值。TS編譯器只是包含了一個 "member;",輸出結果確實是 "undefined"
。我很確定這個問題只發生在變數被覆寫的函式中,而該函式被父建構式呼叫。
誰能向我解釋一下為什么會發生這種情況?
class Parent {
constructor(initArgs) {
this.init(initArgs)。
}
init(){}。
}
class ChildTest1 extends Parent {
init(args) {
this.member = args;
}
test() {
console. log(`Member of ChildTest1 has value of "${this.member}"`) 。
}
}
class ChildTest2 extends Parent {
member = "default";
init(args) {
this.member = args;
}
test() {
console. log(`Member of ChildTest2 has value of "${this.member}"`) 。
}
}
new ChildTest1("Hello World").test() 。
new ChildTest2("Hello World").test() 。
輸出結果如下:
ChildTest1的成員的值是 "Hello World"
ChildTest2的成員的值是 "default"。uj5u.com熱心網友回復:
你的變數在初始化時被覆寫了。屬性的初始化和建構式的執行順序如下:
你的父類的建構式執行并將member初始化為Hello World
你的子類屬性被初始化,覆寫了先前初始化的成員變數。
你的子類建構式被執行
我將你的代碼變得更加明確(注意,添加子類建構式與你的例子在功能上是等同的)來演示:
class Parent {
constructor(initArgs) {
this.init(initArgs)。
console.log(`Parent Constructor: ChildTest2的成員值為"${this.member}"`)。)
}
init(){}。
}
class ChildTest2 extends Parent {
member = "default";
constructor(initArgs) {
super(initArgs)。
console.log(`Child Constructor: ChildTest2的成員值為"${this.member}"`)。)
}
init(args){
this.member = args;
console.log(`Init: ChildTest2的成員值為"${this.member}"`)。)
}
test(){
console.log(`Test: ChildTest2的成員值為"${this.member}"`)。)
}
}
new ChildTest2("Hello World").test()。
這就列印出:
[LOG] 。"Init: ChildTest2的成員值為"Hello World"
[LOG]。"Parent Constructor: ChildTest2的成員值為"Hello World"
[LOG]。"兒童構造器。ChildTest2的成員值為"default""。
[LOG]。"測驗。ChildTest2的成員值為"default"
作為一個心理模型,你可以假設類的屬性初始化發生在建構式內部的super(..)呼叫之后。更多關于這個的內容這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331537.html
標籤:
