【问题标题】:Implement Smart / self-overwriting / lazy getters in strict mode [duplicate]在严格模式下实现智能/自覆盖/惰性获取器[重复]
【发布时间】:2018-04-07 18:51:04
【问题描述】:

在 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: setting getter-only property "y"

如果我删除“使用严格”,则代码可以正常工作。
如何让它在严格模式下工作?

【问题讨论】:

  • @JonasW。如果您在控制台中运行它以让严格模式指令生效,您可能必须将其包装在 IIFE 中。它也可以在脚本中工作。

标签: javascript getter-setter strict


【解决方案1】:

delete 关键字与您的想法不同 - it only deletes own properties。然而Obj.prototype.yobj.j 之间有一个重要的区别。

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

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

严格模式和草率模式之间的区别只是缺少的 setter 要么会导致异常,要么会被忽略。

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

【讨论】:

  • 几年过去了,但仍然......感谢详细的回答,但是......让我们说他确实想删除 y getter 并将 y 永久设置为 101 (管他呢)。不管实际意义如何,OP 的代码与他在 Mozilla 网站上链接的示例有何不同? (我现在正在努力解决类似的问题)。
  • 实际上......在进一步审查中,您对另一个链接('已经有答案')SO问题的回答似乎回答了我的上述问题。 Mozilla 网站 (developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…) 上的实际代码在 notifier 为静态时有效,但在非静态时无效。 IE。删除并重新分配原型属性,而不是实例上的this。我现在很想删除我的 cmets,但也许将它们保留在这里可能会在将来对其他人有所帮助。不管怎样,谢谢!
  • @DavidT MDN 示例使用纯对象字面量且没有继承,而 OP 使用带有 getter 的对象作为他尝试访问 yobj 的原型。在访问Obj.prototype.y(尽管x 未定义,这使其导致NaN)或使用delete Obj.prototype.y 编写代码时(对于其他new Obj 实例当然会破坏.y),它会起作用.
  • 再次感谢。好的,我认为这是有道理的。我正在尝试在课堂上做到这一点。诚然,有时我仍然在努力理解 JS 的原型 OOP 与我更熟悉的东西:传统类 OOP(我理解 JS 中最近的 class 语法只是糖)。我很困惑为什么 MDN 示例在类中是静态的而不是在实例化对象中时有效,尽管我认为现在我明白只有专门制作对象的属性而不是类的(原型)才有意义。对吗?
  • @DavidT 是的,除非您将class 子类化,否则您通常会访问定义它的(类)对象上的静态属性,而不是继承它的东西。
猜你喜欢
  • 1970-01-01
  • 2015-04-20
  • 2012-07-31
  • 2012-04-18
  • 2017-01-07
  • 2016-11-20
  • 2012-12-23
  • 2015-10-12
相关资源
最近更新 更多