Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Lazy getter doesn't work in classes

class a {
    get b() {
        delete this.b;
        return this.b = 1;
    }
}

var c = {
    get b() {
        delete this.b;
        return this.b = 1;
    }
}

console.log(c.b); // works as expected
console.log((new a()).b); // throws error

The above code should work fine but the last line throws.

Uncaught TypeError: Cannot set property b of # which has only a getter(…)

Clearly the getter is not being deleted in class whereas it works fine in object. I am on latest stable chrome.

Lazy Getter MDN Entry

like image 869
Achshar Avatar asked Jun 22 '16 20:06

Achshar


1 Answers

The getter of the class sits on the .prototype object, not on this, that's why your attempt to delete it fails (and, as Jeremy points out, it is not deletable).

You can however simply create an own property on the instance that shadows the getter:

class a {
    get b() {
        Object.defineProperty(this, "b", { value: 1, writable: false, configurable: true })
        return this.b;
    }
}

var c = new a;
console.log(c.b); // 1

We have to use Object.defineProperty() as a simple assignment would find the inherited property that has no setter and throws.

like image 183
Bergi Avatar answered Oct 22 '22 08:10

Bergi