ES6静态属性继承中的微妙(误)行为

时间:2018-03-28 22:34:50

标签: javascript

当在ES6类上定义静态属性,并且您有其他扩展该类的类时,对父类的属性的任何更改似乎都会更改所有子类的值。这似乎是一个微妙的原型链问题。如果你首先在子类上设置属性值,那么它似乎“拥有”它 - 即。它不会反映超类的变化。我的问题是我想要一个类属性,它在第一次使用类时标记一次保证的初始化初始化,并且因为这是一个库/框架,所以我不想强迫用户显式设置静态值在他们自己的子类定义中。除了拥有跟踪它的全局之外,还有其他方法可以将子类的静态属性分开吗?

演示问题的代码:

class Class1 {
    static get initialized() { return this.$initialized }
    static set initialized(flag) { this.$initialized = flag}
}
class Class2 extends Class1 {}

Class1.initialized - >未定义

Class1.initialized = false;

Class2.initialized - >假

Class1.initialized = true;

Class2.initialized - >真

1 个答案:

答案 0 :(得分:0)

问题是$initialized属性也是继承的,所以一旦超类初始化,这将反映在所有子类中。您可以编写getter,以便忽略继承的属性:

class Class1 {
    static get initialized() {
      return this.hasOwnProperty("$initialized")
        ? this.$initialized
        : undefined; // or whatever default value you want
    }
    static set initialized(flag) {
      this.$initialized = flag
    }
}