在javascript中,子类中的字段初始化发生在父类中的构造函数完成之后。这是故意的吗?

在javascript中,子类中的字段初始化发生在父类中的构造函数完成之后。这是故意的吗?,javascript,es6-class,Javascript,Es6 Class,表现它比描述它容易。这是密码 let ns = {}; ns.A = class { constructor() { this.Virtual(); } Virtual() { } }; ns.B = class extends ns.A { constructor() { super(); alert(this.Field); } Field = 0; Virt

表现它比描述它容易。这是密码

let ns = {};

ns.A = class {
    constructor() { 
        this.Virtual();
    }   

    Virtual() {
    }
};

ns.B = class extends ns.A {
    constructor() {
        super();
        alert(this.Field);
    }

    Field = 0;  

    Virtual() {
        this.Field = 123;
    }
}
alert()
表示
this.Field
等于0。也就是说,B类中的字段初始化是在A构造函数完成后执行的。这是Javascript中的“设计”吗

如果我把
字段
放在B类的原型中,那么一切都正常,就像其他语言一样。比如说

let ns = {};

ns.A = class {
    constructor() { 
        this.Virtual();
    }   

    Virtual() {
    }
};

ns.B = class extends ns.A {
    constructor() {
        super();
        alert(this.Field);
    }

    //Field = 0;    

    Virtual() {
        this.Field = 123;
    }
}

ns.B.prototype.Field;
很抱歉在这里打扰您,但我不知道报告此问题的正确位置。

来源:

在计算字段初始值设定项时

基类:在构造函数执行的开始

派生类:就在super()返回之后

说明:

A类{
构造函数(){
log('A constructor start');
这个.Virtual();
log('A constructor end');
}
Field=(()=>{console.log('A Field init');返回1})()
虚拟的{
}
};
B类扩展了A类{
构造函数(){
console.log('B constructor start')
超级();
console.log('B constructor end')
}
字段=(()=>{console.log('B Field init');返回2})()
虚拟的{
console.log('B virtual')
该字段=123;
}
};
console.log(new B())
是的,这是通过设计实现的(在
super()
调用结束时对它们进行评估,其中
已初始化为父构造函数创建的实例)-但是从构造函数调用虚拟方法总是一个坏主意(不仅仅是在JavaScript中)。