繁体   English   中英

不能通过Babel的transform-class-properties在父类构造函数中使用子类的属性

[英]Cannot use child class' properties within parent class constructor via Babel's transform-class-properties

当扩展父类并通过Babel的'transform-class-properties'插件声明子类的属性时,子类的任何类属性都不能通过父类的构造函数方法访问。

class One {

    internal = 1;

    constructor() {
        console.log('constructor internal', this.internal);
    }

}

class Two extends One {

    internal = 2;

}

new Two();

在上面的示例中,'constructor internal 1'将输出到控制台。 在查看已编译的代码时,这显然是为什么,首先执行父类,然后将结果对象与子类集成。

如果这是设计的道歉,但它让我困惑,因为下面的代码按照我在非构造函数方法中期望的方式工作(因此boot()方法引用子类''internal'属性值):

class One {

    internal = 1;

    constructor() {
        console.log('constructor internal', this.internal);
    }

    boot() {
        console.log('boot internal', this.internal);
    }

}

class Two extends One {

    internal = 2;

    constructor() {
            super();

            this.boot();
    }

}

new Two();

因此,即使在调用父类声明的方法时,它也将继承子类的属性。 它只是构造函数方法,似乎没有按预期行事(至少我是 - 再次,如果这被错误地解释,道歉,但在相对的Babel页面上没有列出任何警告。)

谢谢。

我觉得这很自然。 如果要覆盖父类的属性init值,则应在派生类的构造函数中执行此操作。

class Two extends One {

    constructor() {
        // Call parent constructor.
        super();
        // Override here.
        this.internal = 2;
    }

}

希望能帮助到你。 快乐编码(:

loganfsmyth在这里非常清楚地回答了我的问题: https ://phabricator.babeljs.io/T7567(谢谢!)

这确实是预期的行为。 Babel的实现有点不正确,因为在一个完美的世界中,这也会引发错误,因为你不应该在父母和孩子中定义相同的属性,但我们现在不这样做。

在以下情况下初始化类属性:

  • 对于基类,在构造函数执行之前

  • 对于子类,在super()结束时

当给定的构造函数初始化它的绑定时,它使用该类绑定,它不知道子类中的任何内容。 这意味着你的One类知道值应该是1,所以这就是它设置的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM