javascript - JS 类字段

标签 javascript class ecmascript-6 class-fields

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

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

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

最佳答案

你在上面说“不管语言如何,它们都是一样的”。

嗯,是和不是。

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

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

因此,“类字段”未包含在 ES6 标准中。预计您会将它们包含在 constructor 方法中,这在 ES6 之前的 Javascript 中很常见。

有人建议创建public class fields .这些看起来像这样:

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');
  }
}

关于javascript - JS 类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43204907/

相关文章:

javascript将对象数组转换为相似但不同的结构

java - 您可以将类型参数 <T> 限制为多个特定类吗

javascript - 从数组中提取值并将它们转换为字符串的最佳方法(允许 ES6)是什么?

angularjs - ES6 Angularjs 指令,从调用 Controller 传入的函数没有构造函数变量

javascript - ES6+React,错误 :React. createElement : type should not be null, 未定义、 bool 值或数字

javascript - 更改可扩展 View 中的图标

IE9 中的 Javascript 问题与 Windows 7 Professional 而不是 Windows 7 Enterprise

Javascript从随机数中播放mp3

java - 编译错误java.lang.nullpointerException

objective-c - 使用[ self 类]有什么意义