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

时间:2018-04-07 18:51:05

标签: javascript getter-setter strict

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

如何让懒惰的玩家在严格的模式下工作? 此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的属性" y"

如果我删除'使用strict',则代码正常 如何让它在严格模式下工作?

1 个答案:

答案 0 :(得分:2)

delete关键字不符合您的想法 - it only deletes own properties。但是Obj.prototype.yobj.j之间存在重要差异。

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

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

strict和sloppy模式之间的区别只是缺少的setter会导致异常或者只是被忽略。

要解决此问题,请删除delete语句 - 它不起作用,并且您不想删除Obj.prototype.y getter,它应该继续在其他{{1}上工作实例。相反,您需要使用Obj的{​​{1}}属性来隐藏它。您可以使用y