以下代码应打印“ Hello World!”。屏幕上。 Insead会打印Error: Cannot read property 'id' of undefined
。为什么?
abstract class Parent {
constructor() {
console.log(this.getData());
}
abstract getData(): string;
}
class Child extends Parent {
constructor(private item: any) {
super();
}
getData(): string {
return this.item.id;
}
}
new Child({id: 'Hello World!'});
Here是一个有效的示例。
答案 0 :(得分:4)
问题在于,在将参数getData
分配给私有字段{{1}之前之前,在Parent
构造函数中对item
的调用发生了}。那是因为自动初始化发生在item
调用之后,而不是在super()
调用之后。查看***
条评论:
abstract class Parent {
constructor() {
console.log(this.getData()); // *** Calls Child's getData
}
abstract getData(): string;
}
class Child extends Parent {
constructor(private item: any) {
super(); // *** Calls Parent's constructor
// ** Automatic initialization happens here, *after* the `super()` call
}
getData(): string {
return this.item.id; // *** So here, `this.item` is `undefined`
}
}
new Child({id: 'Hello World!'});
这是从构造函数中调用方法通常不是最佳实践的原因之一:它们可以被子类覆盖,但是子类的初始化可能不完整(如您的情况)。