hasOwnProperty和ECMAScript 5严格模式

3
我很好奇:有没有人知道为什么 ECMAScript5 规范在严格模式下为预定义对象原型的属性设置得更严格一些呢?例如,似乎没有关于 hasOwnProperty 如何定义的信息。我尝试重新定义它(并在 FF4 beta 中测试了代码),结果居然能够成功。如果我没做错什么,这意味着任何人都可以仍然重定义 Object.prototype.hasOwnProperty 属性,并真正捣乱依赖它工作的所有代码... 您对此有何想法?
编辑:当我查看规范时,增加了一些更多的信息...
正如我在下面的评论中所说,在严格模式下您无法真正更改 Object.prototype,因为已经应用了元数据(Writable、Enumerable 和 Configurable 都被设置为 false),并且我正在使用的 FF 4 beta(用于运行我的测试)确实会生成异常。
谢谢。

问题是:默认情况下内置对象是否被封闭?我还没有深入研究ES5,所以我不知道这个问题的答案。 - Šime Vidas
@Šime Vidas 不,内置对象默认情况下不是密封的。它们的[[Extensible]]设置为true,因此您可以轻松地向它们添加属性(请参见第15节)。据我所知,目标是保持ES对象模型的灵活性,仅锁定绝对关键的部分(例如使全局的undefinedNaNInfinity属性不可写和不可配置:)) - kangax
1个回答

3

我可以随意清除Object.prototype上的所有内容,所以在你的项目/网站中不要包含这样的代码,或者做得更好一些,找到那些正在做这种事情的白痴并确保踢他们的裆部。

我的意思是,我甚至可以通过执行True = False来毁掉任何给定的Python(2.x)程序。

你永远无法防范白痴。永远不行。试着去教育或避免他们。

编辑

为了澄清这个问题的不可能性,如果你将你的脚本封装到一个匿名包装器中(如果你与其他代码一起使用它,你应该这样做),那么"use strict"将局限于你的代码。

这意味着,如果邪恶的白痴代码没有自己使用严格模式 - 他们不会...除非他们是彻头彻尾的白痴,我在这里不谈论这个问题 - 它们运行在ES3中,而你美丽的严格性甚至不存在。


1
永远不要和白痴争论,他们会把你拖到他们的水平,然后用经验打败你。 - qwertymk
其实并不是这样。看一下规范,我发现Object.prototype具有以下属性:Writable: false, enumerable: false和configurable: false。我也尝试过更改它,并且我注意到如果你尝试这样做,FF确实会生成一个异常。 - Luis Abreu
@Luis,我用词不当了,我只需从中删除所有属性即可,只有Object的原型属性无法被覆盖。 - Ivo Wetzel
好的,我明白了。无论如何,我仍然有兴趣知道规范为什么没有走得那么远。拥有原型属性很重要吗?是的,很重要。拥有一些不可配置、不可写的继承属性例如hasOwnProperty很重要吗?我认为是的,但我真的很想知道不强制实施这种行为背后的原理。 - Luis Abreu
@Luis 真的不知道为什么他们没有这样做,我猜如果他们想要这样做,他们就需要改变 ES3,而且肯定有代码依赖于你可以覆盖内置函数的事实...可悲的是,他们真的很在意不破坏那些代码 :/ - Ivo Wetzel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接