假设以下 Typescript 示例
class Animal {
public name: string;
constructor() {
console.log(this.name);
}
}
class Snake extends Animal {
public name = 'BeatSSS';
}
let someSnake = new Snake();
Run Code Online (Sandbox Code Playgroud)
当然,console.log()日志undefined。并BeatSSS在意料之中。
我们如何constructor()用子属性做来自父级的事情?
实际想法:
在父构造函数中获取子值的一种巧妙方法是setTimeout()不使用delay属性。
使用 yout 示例,代码如下:
class Animal {
public name: string;
constructor() {
setTimeout(() => console.log(this.name));
}
}
class Snake extends Animal {
public name = 'BeatSSS';
}
let someSnake = new Snake();
Run Code Online (Sandbox Code Playgroud)
为什么它有效?
因为传递给的函数setTimeout将在当前调用堆栈被清除后运行。此时,子属性值的分配将完成,因此您可以从父属性访问该值。
不过要小心!
在清除当前调用堆栈之前,该值将保持未定义状态。这意味着,例如,如果您使用该值来初始化父级中的对象,则在调用堆栈结束之前它不会被正确初始化。
下面的例子说明了这个问题:
class Animal {
public name: string;
public name_copy: string;
constructor() {
setTimeout(() => {
this.name_copy = name;
console.log('assigning name_copy --->', this.name_copy);
});
}
}
class Snake extends Animal {
public name = 'BeatSSS';
}
let someSnake = new Snake();
console.log('child name_copy --->', someSnake.name_copy);
Run Code Online (Sandbox Code Playgroud)
该脚本将打印出:
child name_copy ---> **undefined**
assigning name_copy ---> **BeatSSS**
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4795 次 |
| 最近记录: |