所以我有一个简单的Javascript类
class MyClass {
constructor(x) {
this.x = x === undefined ? 0 : x;
}
get x() {
return this.x;
}
}
创建MyClass时,我希望将x设置为作为参数传递的值。此后,我不希望能够对其进行更改,因此我故意没有设置set x()方法。
但是,我想我必须缺少一些基本知识,因为这给了我“无法设置属性...仅具有吸气剂”错误。
如何在不创建setter方法的情况下为x赋值?
答案 0 :(得分:0)
class MyClass
{
constructor(x) {
this.x = x === undefined ? 0 : x;
}
get() {
return this.x;
}
set(x) { return this.x = x;}
}
答案 1 :(得分:0)
如果您想在类定义中创建一个不可变的属性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);
答案 2 :(得分:0)
如果您希望实例属性为只读,则使其不可写:
class MyClass {
constructor(x) {
Object.defineProperty(this, "x", { value: x || 0 });
}
}
一个属性可以是一个“简单”属性(如过去所有属性),也可以是一个getter / setter属性。
当属性是getter / setter属性时,对该属性的 all 引用将通过getter和setter函数中的getter或setter,包括 includes 。因此,要存储属性,您需要使用备用属性名称或(更好的)Symbol实例。
答案 3 :(得分:-2)
这里有几个问题。
通过get x()
进行吸气时,导致this.x
导致调用吸气剂,由于您的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
调用getter不会感到困惑。