是否为每个实例重新创建了对象属性?

时间:2016-06-09 19:41:49

标签: javascript ecmascript-6

假设你有

class Foo {
  constructor(){
     return this;
  }
}

Foo.modes = {
 ModeA : 0,
 ModeB : 1
}

是否会为每个Foo实例创建Foo.modes?怎么能证明这是真的?

1 个答案:

答案 0 :(得分:3)

这不是在构造函数中创建的实例属性,它是一个静态(类)属性,所以没有。它只会被创建一次 - 当声明对象文字时 - 并分配给类构造函数。该类的任何实例都可以访问,但不会复制。

要为每个类实例创建一个对象,您可以制作副本或新对象,并将其分配给this上的属性:

class Foo {
  constructor(){
    this.modes = {
      ModeA : 0,
      ModeB : 1
    }
  }
}

要为类创建一个对象,您应该像编辑现在一样分配给构造函数。如果您看一下Babel的静态方法输出,您可以看到它是如何工作的。 ES6代码:

class Foo {
  static bar() { }
  baz() { }
}

将产生ES5:

var Foo = function () {
  function Foo() {
    _classCallCheck(this, Foo);
  }

  Foo.bar = function bar() {};

  Foo.prototype.baz = function baz() {};

  return Foo;
}();

分配给构造函数原型的属性将是""的一部分。实例,而直接分配给构造函数的属性将是该类的一部分。