懒惰的getter在课堂上不起作用

Ach*_*har 6 javascript getter ecmascript-6

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
Run Code Online (Sandbox Code Playgroud)

上面的代码应该工作正常,但最后一行抛出.

未捕获的TypeError:无法设置只有getter(...)的#的属​​性b

很明显,getter在类中没有被删除,而它在对象中工作正常.我是最新的稳定镀铬.

懒惰的Getter MDN入口

Ber*_*rgi 13

类的getter位于.prototype对象上,而不是on this,这就是为什么你的尝试delete失败了(而且,正如Jeremy指出的那样,它是不可删除的).

但是,您可以简单地创建上阴影,吸附剂中的实例的自己的财产:

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
Run Code Online (Sandbox Code Playgroud)

我们必须使用Object.defineProperty()作为一个简单的赋值,找到没有setter和throws的继承属性.

  • 哦.. 跟踪一个吸气剂——这个想法从未在我脑海中闪过。这很酷。 (2认同)
  • @Redu:尝试“zz.b = 100”,您将得到一个*Uncaught RangeError:超出最大调用堆栈大小* (2认同)