我想模拟类似于固定对象的东西,这样就不会有新成员添加到对象中。Object.seal(Obj)似乎是正确的方法,但当我尝试创建新成员时,它不会抛出异常。成员不会被创建,但它是在静默中发生的。
var O = { a: 111 }
Object.seal(O)
O.b = 222 <------ here the exception is expected (trying to add a member "b")
O.a = 333
console.log(O) // { a: 333 }为什么有人想要这种静默行为,为什么不抛出异常?
发布于 2013-12-02 02:57:22
对密封对象的赋值行为会随着浏览器的不同而变化。例如,最新发布的chrome的行为可能与您预期的一样。出于实际目的,可以安全地假设,向密封对象添加成员仅在严格模式下引发异常。
;(function () {
'use strict';
var O = { a: 111 }
Object.seal(O)
O.b = 222
O.a = 333
console.log(O) // { a: 333 }
}());不出所料,这个自调用的匿名函数抛出了一个错误。不幸的是,在旧的浏览器上,您不能依赖于https://github.com/kriskowal/es5-shim之类的多边形填充
事实上,Object原型上的seal方法避免了“TypeError”异常,但在调用时会静默失败。
从文档中:
除非您依赖于此方法的安全性和安全性规定,否则这应该没有问题,而这些规定在传统引擎中是不可能获得的。
发布于 2013-12-03 01:33:10
对不可扩展对象的不存在属性的赋值被指定为引发,但仅当该赋值包含在严格模式代码中时才会引发。请参阅ES5.1 Annex C的第四个项目符号。
如果你想确保你得到一个异常,确保你用"use strict“标记你的代码;
这样的赋值不会抛出非严格代码的原因是为了保持与符合ECMAScript标准的ES3 (或更早的)版本的代码的向后兼容性。可扩展/不可扩展的概念在ES5出现之前是不存在的,但是一些实现可能公开了不能添加属性的主机对象(即DOM对象)。使用ES3语义,对这些对象的赋值不会抛出。
https://stackoverflow.com/questions/20315906
复制相似问题