无法设置属性...仅具有吸气剂(javascript es6)

时间:2019-02-06 21:27:48

标签: javascript class constructor typeerror getter-setter

所以我有一个简单的Javascript类

class MyClass {
    constructor(x) {
        this.x = x === undefined ? 0 : x;
    }

    get x() {
        return this.x;
    }
}

创建MyClass时,我希望将x设置为作为参数传递的值。此后,我不希望能够对其进行更改,因此我故意没有设置set x()方法。

但是,我想我必须缺少一些基本知识,因为这给了我“无法设置属性...仅具有吸气剂”错误。

如何在不创建setter方法的情况下为x赋值?

4 个答案:

答案 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不会感到困惑。