所以我有一个简单的Javascript类
class MyClass {
constructor(x) {
this.x = x === undefined ? 0 : x;
}
get x() {
return this.x;
}
}
当创建一个MyClass的,我想这是X设置为传过来的参数值。在此之后,我不希望它能够被改变,所以我特意没有取得一组X()方法。
不过,我想我必须失去了一些基本的东西,因为这是给我的“无法设置属性......其中只有吸气”的错误。
我该如何分配,而无需创建setter方法的值对x?
这里有几个问题。
当您通过get x()
你造成this.x
导致调用getter方法,将无限递归一个getter因您的get x()
做this.x
。
更换你的引用,在这个像这样的代码this.x
到this._x
:
class MyClass {
constructor(x) {
this._x = x === undefined ? 0 : x;
}
get x() {
return this._x;
}
}
现在你的包裹x
这是现在_x
不会被迷惑了通过this.x
吸气剂的调用。
class MyClass
{
constructor(x) {
this.x = x === undefined ? 0 : x;
}
get() {
return this.x;
}
set(x) { return this.x = x;}
}
如果你想你的类定义中创建一个不可改变的属性a
,此操作系统的一种方式与方法的JavaScript给出就是做这个(使用Object.defineProperty()
)这样做。
class MyClass {
constructor(x) {
Object.defineProperty(this, 'a', {
enumerable: false,
configurable: false,
writable: false,
value: x || 'empty'
});
}
}
let o = new MyClass('Hello');
console.log(o.a);
o.a = 'Will not change';
console.log(o.a);
如果你想要一个实例属性为只读,然后使之不可写:
class MyClass {
constructor(x) {
Object.defineProperty(this, "x", { value: x || 0 });
}
}
一个属性可以是“简单”属性,因为所有性质在往昔,或getter / setter属性的日子。
当一个属性是一个getter / setter属性,该属性的所有引用都要经过getter或setter,包括来自getter和setter函数内。因此,存储你需要使用一个替代的属性名称或(更好的)一个符号实例的属性。