Javascript hasOwnProperty和ECMAScript 5严格模式

Javascript hasOwnProperty和ECMAScript 5严格模式,javascript,strict,ecmascript-5,hasownproperty,Javascript,Strict,Ecmascript 5,Hasownproperty,我很好奇:有人知道为什么ECMAScript 5规范没有在严格模式下更严格地定义预定义对象原型的属性吗?例如,似乎没有关于hasOwnProperty定义方式的信息。我已经尝试过重新定义它(并在FF4测试版中测试了代码),我成功地解决了这个问题。如果我没有做错任何事,那么这意味着任何人都可以重新定义Object.prototype.hasOwnProperty属性,并真正搞糟所有依赖它的工作属性的代码 对此有何想法 编辑:当我翻阅说明书时,会有更多的信息 正如我在下面的评论中所说,由于应用于Ob

我很好奇:有人知道为什么ECMAScript 5规范没有在严格模式下更严格地定义预定义对象原型的属性吗?例如,似乎没有关于hasOwnProperty定义方式的信息。我已经尝试过重新定义它(并在FF4测试版中测试了代码),我成功地解决了这个问题。如果我没有做错任何事,那么这意味着任何人都可以重新定义Object.prototype.hasOwnProperty属性,并真正搞糟所有依赖它的工作属性的代码

对此有何想法

编辑:当我翻阅说明书时,会有更多的信息

正如我在下面的评论中所说,由于应用于Object.prototype的元数据(可写、可枚举和可配置都设置为false)以及FF 4 beta(我正在使用它运行测试)确实生成了异常,所以您无法在严格模式下真正更改Object.prototype


谢谢。

还有?我可以杀掉
Object.prototype
上的所有东西,如果我想,不要在你的项目/站点中包含这些代码,不要做得更好,找到那些做这些事情的白痴,并确保踢他们的球

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

你永远不能保护自己不受白痴的伤害。从未。尽量教育或避免他们

编辑

为了澄清这一点,如果您将脚本封装到匿名包装器中(如果与其他代码一起使用,您应该这样做),
“use strict”
将是您代码的本地代码


这意味着,如果邪恶的白痴代码本身不使用严格模式,那么他们就不会。。。除非他们是十足的白痴,我在这里不谈这一点——他们在ES3中运行,而你美丽的严格性根本不存在。

问题是:内置对象是否默认密封?我还没有深入研究ES5,所以我不知道这个问题的答案。@Šime Vidas不,默认情况下内置对象不是密封的。它们的[[Extensible]]设置为
true
,因此您可以轻松地向它们添加属性(请参见第15节)。AIUI的目标是保持ES对象模型的灵活性,只锁定绝对关键的部分(例如使全局
未定义
NaN
无限
属性不可写和不可配置:)“不要和白痴争论,他们会把你拖到他们的水平,用经验打败你”嗯,不是真的。查看规范,我看到Object.prototype具有以下属性:Writable:false、enumerable:false和configurable:false。我也尝试过更改它,我注意到如果您尝试这样做,FF确实会生成一个异常。@Luis猜想我使用了错误的措辞,我可以简单地从中删除所有属性,只有
对象的
prototype
属性不能被覆盖。好的,明白了。无论如何,我仍然有兴趣知道为什么规范没有走那么远。拥有原型属性是否重要?是的。拥有一些不可配置、不可写的继承属性(如hasOwnProperty)是否重要?我说是的,但我真的很好奇不强迫这种行为背后的原因。@Luis真的不知道他们为什么不这么做,猜猜如果他们想这么做,他们会需要更改ES3,而且肯定有代码依赖于您可以覆盖内置的事实。。。可悲的是,他们真的很在乎不破坏这一准则:/