JavaScript类语法:静态数据成员

时间:2016-08-30 14:10:48

标签: javascript class static

我无法找到有关如何使用(相对较新的)类语法在JavaScript中定义静态数据成员的任何信息。它甚至可能吗?请参阅以下示例代码:

class Foo {
  constructor() {
    this.name = 'Default Name for each Instance';
    // staticData1 = 'Static Data 1'; // syntax error
    let staticData2 = 'Static Data 2'; // undefined outside
  }

  doSthSpecial() {
    console.log('Executing a method from instance "' + this.name + '"');
  }

  static doSthStatic() {
    console.log('Executing a method that does the same for each instance of "Foo"');
  }
}

foo = new Foo();
console.log(foo.name);
foo.doSthSpecial();
Foo.doSthStatic();
// The problematic case:
console.log(Foo.staticData2);

4 个答案:

答案 0 :(得分:3)

这很有效,它可以将凌乱的细节保留在课堂内。

class cExample
{  
  static init_index() {
     cExample.index = 0;
  }   

  static get_index() {
     return ++cExample.index;
  }   
}

cExample.init_index();

example = new cExample();
console.log(cExample.get_index());  // 1
example = new cExample();
console.log(cExample.get_index());  // 2
example = new cExample();
console.log(cExample.get_index());  // 3

答案 1 :(得分:2)

在定义Foo之后,您可以使用Foo.staticData2 = 'Static Data 2'来定义类Foo的静态数据成员。

根据ES6,类定义中没有静态属性,只有静态方法。

在ES7中,有一个关于静态字段定义的提议,目前它处于第2阶段(https://github.com/tc39/proposal-class-public-fields)。好消息是:Babel支持这一提议(https://babeljs.io/docs/plugins/transform-class-properties/)。

答案 2 :(得分:1)

我找到了一个非常接近所要求的解决方法。可以使用计算属性(“get方法”)并将其设置为静态。然后就不需要“()”函数/方法调用语法,并且它可以在没有该类的任何实例的情况下使用。虽然可能效率稍低。 例如:

let Foo = class {
  static get staticData() {
    return 'Static Data';
  }
}

console.log(Foo.staticData);

答案 3 :(得分:1)

另一种对我有用的解决方法,虽然不是最优雅的方法,但至少要等到ES7才在类之后找到静态成员:

class Field {

  constructor(index) {
    this.index = index;
  }

  getName(name) {
    return this.name;
  }
}

Field.DISPLAY_AS_TEXT = 2001;
Field.DISPLAY_AS_BARCODE = 2002;