在 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.y
和 obj.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/