You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在严格模式下实现可正常工作的智能自覆盖惰性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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:49:41