JS Class 字段
JS Class Fields
使用 ES6 classes,我们有 getter 和 setter 属性,但没有字段选项(或者至少我知道)。
使用 Object.defineProperty
,您可以使用 value
属性 设置它们。如果有的话,你如何对 classes 做同样的事情?
我知道它可以在 class 构造函数中完成,但如果可能的话我希望它是分开的。
你上面说的"they're the same thing regardless of language".
好吧,是也不是。
是的,编程语言之间有明显的关系,但 Javascript/ECMAScript 有一些不寻常的特征。不要只是期待概念能够准确翻译。
关键是 Javascript 不是基于 class 的,即使它没有类似 class 的语法。它是基于原型的。这意味着您可以在任何对象上声明任何 属性。您不需要将其包含在 class 声明中。
因此,"class fields" 未包含在 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
关键是每个"instance"都有相同的方法。但是,每个 "instance" 都有不同的 属性。这是解释为什么最初不包含此语法的区别。
作为提案,目前不支持此功能。但是,它可以通过转译来使用。 Babel.js(正如我所写,Stage 2 预设将上述代码转换为:
class Dog {
constructor(name) {
this.tail = new Tail();
this.name = name;
}
bark() {
console.log('woof');
}
}
Class fields are now a stage 3 ECMAScript proposal and are already supported in current versions of Chrome and in Node.js 12. The proposal also references static fields.
class MyClass {
static createdObjects = 0;
objectNumber = MyClass.createdObjects++;
}
使用 ES6 classes,我们有 getter 和 setter 属性,但没有字段选项(或者至少我知道)。
使用 Object.defineProperty
,您可以使用 value
属性 设置它们。如果有的话,你如何对 classes 做同样的事情?
我知道它可以在 class 构造函数中完成,但如果可能的话我希望它是分开的。
你上面说的"they're the same thing regardless of language".
好吧,是也不是。
是的,编程语言之间有明显的关系,但 Javascript/ECMAScript 有一些不寻常的特征。不要只是期待概念能够准确翻译。
关键是 Javascript 不是基于 class 的,即使它没有类似 class 的语法。它是基于原型的。这意味着您可以在任何对象上声明任何 属性。您不需要将其包含在 class 声明中。
因此,"class fields" 未包含在 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
关键是每个"instance"都有相同的方法。但是,每个 "instance" 都有不同的 属性。这是解释为什么最初不包含此语法的区别。
作为提案,目前不支持此功能。但是,它可以通过转译来使用。 Babel.js(正如我所写,Stage 2 预设将上述代码转换为:
class Dog {
constructor(name) {
this.tail = new Tail();
this.name = name;
}
bark() {
console.log('woof');
}
}
Class fields are now a stage 3 ECMAScript proposal and are already supported in current versions of Chrome and in Node.js 12. The proposal also references static fields.
class MyClass {
static createdObjects = 0;
objectNumber = MyClass.createdObjects++;
}