从父构造函数访问子属性

pab*_*rsk 5 typescript

假设以下 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()用子属性做来自父级的事情?

实际想法:

  • super() 调用 child 构造() 解决了问题,但我需要对每个孩子都这样做。不是很优雅的解决方案。
  • 在父构造上使用超时会记录正确的值,但不能立即使用类的实例(因为超时尚未执行)。

Max*_*ruz 2

在父构造函数中获取子值的一种巧妙方法是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)