2

对于 ES6 类,我们有 getter 和 setter 属性,但没有字段选项(或者至少我知道)。

使用Object.defineProperty,您可以使用value属性设置它们。如果有的话,你如何对课程做同样的事情?

我知道它可以在类构造函数中完成,但如果可能的话,我希望它是分开的。

4

2 回答 2

7

您在上面说“无论语言如何,它们都是一样的”。

嗯,是的,也不是。

是的,编程语言之间有明显的关系,但是 Javascript/ECMAScript 有一些不寻常的特性。不要只是期望概念能够准确翻译。

关键是 Javascript 不是基于类的,即使它没有类似类的语法。它是基于原型的。这意味着您可以在任何对象上声明任何属性。您不需要将它包含在类声明中。

出于这个原因,“类字段”没有包含在 ES6 标准中。预计您会将它们包含在constructor方法中,这在 ES6 之前的 Javascript 中是正常的。

有一个创建公共类字段的建议。这些看起来像这样:

class Dog {
  constructor(name) {
    this.name = name;
  }
  bark() {
    console.log('woof');
  }
  tail = new Tail()
}

然后,您可以拥有如下所示的代码:

let benji = new Dog('Benji');
let rover = new Dog('Rover');
console.log(benji.bark === rover.bark); // true
console.log(benji.tail === rover.tail); // false

关键是每个“实例”都有相同的方法。但是,每个“实例”都有不同的属性。这是解释为什么最初不包含此语法的区别。

作为一项提案,目前不支持此功能。但是,它可以使用转译来使用。Babel.js(正如我所写,Stage 2 预设将上述代码转换为:

class Dog {
  constructor(name) {
    this.tail = new Tail();

    this.name = name;
  }
  bark() {
    console.log('woof');
  }
}
于 2017-04-04T17:00:16.947 回答
0

类字段现在是第 3 阶段的 ECMAScript 提案,并且已在当前版本的 Chrome 和 Node.js 12 中得到支持。该提案还引用了静态字段

class MyClass {
    static createdObjects = 0;
    objectNumber = MyClass.createdObjects++;
}
于 2019-05-10T13:08:32.000 回答