javascript - 在严格模式下实现智能/自覆盖/惰性 setter/getter

标签 javascript getter-setter strict

在 JavaScript 中,惰性 getter 可以提高性能。
一些解释可以在这里找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get#Smart_self-overwriting_lazy_getters

如何让惰性 setter/getter 在严格模式下工作?
此 JavaScript 代码不起作用:

'use strict'

function Obj(x) {
    this.x = x
}

Obj.prototype = {
    get y() {
    delete this.y
    return this.y = this.x + 1
  }
}

let obj = new Obj(100)

console.log('100 + 1 = ', obj.y)

它给出以下错误:TypeError:设置 getter-only 属性“y”

如果我删除“use strict”,那么代码就可以正常工作。
我如何让它在严格模式下工作?

最佳答案

delete 关键字并不符合您的想法 - it only deletes own properties 。然而,Obj.prototype.yobj.j 之间存在重要区别。

obj 上使用的 getter 中使用 delete this.y 不会删除任何内容,因为 obj 没有 y 属性。

然后,您尝试在 getter 中分配给 obj.y 。这是行不通的 - 已经有一个继承的 y 访问器属性,因此它将调用该属性的 setter,而不是创建新属性。您可以在使用 getter 后通过检查 obj 进行检查 - 它实际上没有 y: 101 属性,使用 obj.y将再次运行 getter。

严格模式和草率模式之间的区别只是缺少 setter 会导致异常或简单地被忽略。

要解决此问题,请删除 delete 语句 - 它不起作用,而且您无论如何也不想删除 Obj.prototype.y getter,它应该继续在其他 Obj 实例上工作。相反,您需要使用 obj 自己的 y 属性来隐藏它。您可以使用 Object.defineProperty(this, "y", {value: this.x+1}) 来实现此目的。

关于javascript - 在严格模式下实现智能/自覆盖/惰性 setter/getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49710825/

相关文章:

swift - Swift 中属性方法(set、get、didSet、willSet 等)的继承

perl - 如何将 `our` 类变量与 `UNITCHECK` 正确地与 `use strict` 一起使用?

javascript - 严格模式是否与单个 JavaScript 文件隔离?

java - 如何确定 Java 堆的大小

javascript - 使用客户端脚本检测访问者是否在索引页面上

javascript - 如何从混合 html 元素的表中提取值

javascript - 将整个组件的 onClick 和组件内的按钮分开

java - 在 Java 中使用 getter 方法将元素添加到 List 是一种不好的做法吗?

javascript - 将 openCV C++ 视频流式传输到浏览器

Javascript 类 Getter Setter