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

Javascript 在严格模式下实现智能/自覆盖/惰性getter,javascript,getter-setter,strict,Javascript,Getter Setter,Strict,在JavaScript中,惰性getter可以提高性能。 这里可以找到一些解释: 如何让懒惰的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) consol

在JavaScript中,惰性getter可以提高性能。
这里可以找到一些解释:

如何让懒惰的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属性“y”

如果我删除“use strict”,则代码可以正常工作。

如何在严格模式下使其工作?

删除
关键字不符合您的想法-。然而,
Obj.prototype.y
Obj.j
之间有一个重要的区别

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

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

strict模式和sloppy模式之间的区别在于缺少的setter将导致异常或被忽略


要解决此问题,请删除
delete
语句-它不起作用,并且您不想删除
Obj.prototype.y
getter。无论如何,它应该继续在其他
Obj
实例上工作。相反,您需要为
obj
使用自己的
y
属性对其进行阴影处理。您可以使用
Object.defineProperty(this,“y”,{value:this.x+1})

@JonasW。如果在控制台中运行它以使strict mode指令生效,则可能必须将其包装在IIFE中。它也可以在脚本中运行。几年后现在,但仍然。。。谢谢你的详细回答,但是。。。让我们说,无论出于什么原因,他确实想删除y getter,并将y永久设置为101(或其他任何原因)。不管实际意义如何,OP的代码与他在Mozilla网站上链接的示例有何不同?(我现在正在为一个类似的问题而挣扎)事实上。。。在进一步的回顾中,您在另一个链接上的答案(“已经有答案”),所以这个问题似乎回答了我的上述问题。Mozilla站点()上的实际代码在
通知程序
是静态的情况下工作,而不是在非静态的情况下工作。即,删除并重新分配原型属性,但不在实例上指定此属性。我现在很想删除我的评论,但也许把它们保留在这里会对将来的其他人有所帮助。不管怎样,谢谢@DavidT MDN示例使用普通对象文本,不使用继承,而OP使用带有getter的对象作为其
obj
的原型,他试图在其上访问
y
。当访问
Obj.prototype.y
(虽然
x
未定义,导致
NaN
)或使用
delete Obj.prototype.y
编写代码时(当然,对于其他
新的Obj
实例,这会破坏
.y
),它会起作用。再次感谢。好的,我认为这是有道理的。我试着在课堂上这样做。诚然,有时我仍在努力了解JS的原型OOP与我更熟悉的:传统类OOP(我理解JS中最近的
语法只是糖)。我不明白为什么MDN示例在类中是静态的,但在实例化的对象中不是静态的,尽管我认为现在我理解它只有在特别地使对象的属性而不是类(原型)的属性时才有意义。是吗?@DavidT是的,除非您对
类进行子类化,否则您通常会访问定义它的(类)对象上的静态属性,而不是继承它的东西。