Javascript 在严格模式下实现智能/自覆盖/惰性getter
在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
这里可以找到一些解释: 如何让懒惰的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是的,除非您对类进行子类化,否则您通常会访问定义它的(类)对象上的静态属性,而不是继承它的东西。