Cannot Set Property ... Which Only Has Getter (javascript es6)

28,137

Solution 1

There are a couple problems here.

When you make a getter via get x() you are causing this.x to result in calling the getter, which will recurse indefinitely due to your get x() doing this.x.

Replace your references to this.x with this._x in this code like this:

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

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

Now your encapsulated x which is now _x will not be confused for a call to the getter via this.x.

Solution 2

If you want to create an immutable property a within your class definition, this os one way to do so with the method JavaScript gives is to do this (using 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);

Solution 3

If you want an instance property to be read-only, then make it not writable:

class MyClass {
    constructor(x) {
        Object.defineProperty(this, "x", { value: x || 0 });
    }
}

A property can either be a "simple" property, as all properties were in the days of yore, or a getter/setter property.

When a property is a getter/setter property, all references to the property go through the getter or setter, including from within the getter and setter functions. Thus to store the property you need to use an alternative property name or (better) a Symbol instance.

Share:
28,137
user7446944
Author by

user7446944

Updated on February 07, 2020

Comments

  • user7446944
    user7446944 over 4 years

    So I have a simple Javascript class

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

    When a MyClass is created, I want it's x to be set to the value passed in as a parameter. After this, I do not want it to be able to be changed, so I have intentionally not made a set x() method.

    However, I guess I must be missing something fundamental, as this is giving me the "Cannot set property ... which only has getter" error.

    How do I assign a value to x without creating a setter method?

  • user7446944
    user7446944 over 5 years
    Thank you! This is exactly what I needed!