Javascript JS类字段

Javascript JS类字段,javascript,class,ecmascript-6,class-fields,Javascript,Class,Ecmascript 6,Class Fields,对于ES6类,我们有getter和setter属性,但没有字段选项(至少我知道) 使用Object.defineProperty,您可以使用值属性设置它们。如果有的话,你如何在课堂上做同样的事情 我知道它可以在类构造函数中完成,但如果可能的话,我希望它是独立的。您在上面说过“无论使用何种语言,它们都是相同的东西” 嗯,是和否 是的,编程语言之间有着明显的联系,但是Javascript/ECMAScript有一些不寻常的特性。不要只是期望概念能够准确地翻译 关键是Javascript不是基于类的,

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

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

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

您在上面说过“无论使用何种语言,它们都是相同的东西”

嗯,是和否

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

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

因此,ES6标准中不包括“类字段”。我们希望您将它们包括在
构造函数中
方法中,这在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
然后,您可以得到如下代码:

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');
  }
}
现在是第3阶段ECMAScript提案,并且在当前版本的Chrome和Node.js 12中已经得到支持。提案还引用了


我不明白这个问题。你能举个例子说明“它可以在类构造函数中完成”这样我们就可以看到你在寻找什么吗?@lonesomeday在类构造函数中,
this.whather='someValue';
那么你指的是对象属性?“类字段”不是JS中存在的一个概念。是的……它们是相同的,无论使用何种语言。@LoneSomeday实例属性的初始化应该在构造函数中完成。您认为这有什么错?为什么要“单独”完成?您传输的代码中的
名称
从何而来?@Bergi是我原始代码的稍晚版本。现在已更正。谢谢。更明显的是,类字段是多么毫无意义:-)@Bergi这是近似的目标!