如何在严格模式下实现可正常工作的智能自覆盖惰性Getter?
如何让惰性getter在JavaScript严格模式下正常工作?
这个问题我之前也踩过坑!你的代码在严格模式下抛出TypeError的核心原因是:原型上的y是一个只定义了getter、没有setter的访问器属性。当你在getter函数里尝试执行this.y = this.x + 1时,严格模式会因为无法给没有setter的访问器属性赋值而直接报错。另外,delete this.y其实完全没起到预期作用——因为y是定义在原型链上的,实例本身并没有这个属性,delete操作只能删除实例自身的属性,碰不到原型上的。
下面是修复后的代码,完美适配严格模式:
'use strict' function Obj(x) { this.x = x } Obj.prototype = { get y() { // 直接在实例上定义数据属性y,覆盖原型的访问器属性 Object.defineProperty(this, 'y', { value: this.x + 1, writable: true, enumerable: true, configurable: true }) // 返回实例上刚创建的y属性值 return this.y } } let obj = new Obj(100) console.log('100 + 1 = ', obj.y) // 输出:100 + 1 = 101
为什么这样能解决问题?
- 我们用
Object.defineProperty直接在当前实例(也就是this指向的对象)上创建了一个名为y的数据属性,这个属性会直接覆盖原型链上的访问器属性y。 - 显式设置
writable、enumerable、configurable为true(这些也是数据属性的默认值,写出来只是为了更清晰),确保后续可以正常读写、枚举这个属性。 - 当后续再访问
obj.y时,会直接读取实例自身的y数据属性,不会再触发原型上的getter,完全实现了惰性加载的效果。
内容的提问来源于stack exchange,提问作者Hendrik Jan
相关产品推荐
相关产品推荐

