【问题标题】:Javascript ES6 shared class variableJavascript ES6 共享类变量
【发布时间】:2016-04-28 17:54:45
【问题描述】:

我有一个如下所示的课程:

class Foo {
    constructor(arg1, arg2) {
        // ...

        this._some_obj = new SomeObj({
            param1: arg1,
            param2: arg2
        });
    }

    // ...
}

module.exports = Foo;

现在我想做同样的事情,但 _some_obj 在类的所有实例之间共享。

四处搜索后,我不清楚在 ES6 中执行此操作的正确方法。

【问题讨论】:

  • 好吧..你会如何在 es5 中做到这一点?
  • 如果它在所有实例之间共享,那么参数的预期行为是什么?第一个调用会用第一个 args 碰巧是什么来初始化它吗?
  • @loganfsmyth - 是的,在这方面我并没有真正考虑过。我认为应该有某种类型的初始化函数,而不是将这些参数放在构造函数中。

标签: javascript class ecmascript-6


【解决方案1】:

从 ES5 可知,你可以把它放在类的原型对象上:

export class Foo {
    constructor(arg1, arg2) {
        …
    }
    …
}
Foo.prototype._some_obj = new SomeObj({
    param1: val1,
    param2: val2
});

或直接在Foo 上,如果您不需要将其作为实例上的属性进行访问。

【讨论】:

  • 我读到在原型上定义属性是个坏主意,这就是为什么它一开始没有包含在 ES6 类中的原因。这不是真的吗?
  • @SeanLynch 在你没有创建的类上重新定义原型属性并不是一个好主意。例如,Math.prototype.min = 不是一个好覆盖的属性,因为它会影响 Math.min 的每个实例
  • @SterlingArcher - 我明白了。我真的不明白。谢谢!
  • 添加到您拥有的类与添加到原生对象原型不同(这会严重干扰您可能使用的任何库)
  • 在这种情况下,我如何让 SomeObj 的构造函数可以使用 arg1arg2 的值。我认为Foo.prototype._some_obj 会在构造函数被调用之前创建。
【解决方案2】:

使用static 拥有类属性。

class MyClass {
  static myStaticProp = 42;

  constructor() {
    console.log(MyClass.myStaticProp); // Prints '42'
  }
}

注意:这是 Babel 中已实现的功能,但仍处于试验阶段,仅在第一个提案阶段。

【讨论】:

  • 据我了解,static 仅适用于成员函数而非数据。
  • 但在我的情况下,我必须使用构造函数的参数初始化myStaticProp
  • @SeanLynch 您可以初始化为 null 并在构造函数中拥有一个 if (this.myStaticProp === null) { ... }
  • @SeanLynch 你的理解不正确,否则Object.defineProperties(MyClass, ...) 的行为会大不相同。
  • OP 要求 ES6 解决方案
猜你喜欢
  • 2017-03-27
  • 1970-01-01
  • 2012-07-04
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2014-04-27
  • 1970-01-01
相关资源
最近更新 更多