首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript Object.seal()不抛出异常

Javascript Object.seal()不抛出异常
EN

Stack Overflow用户
提问于 2013-12-02 02:54:40
回答 2查看 350关注 0票数 3

我想模拟类似于固定对象的东西,这样就不会有新成员添加到对象中。Object.seal(Obj)似乎是正确的方法,但当我尝试创建新成员时,它不会抛出异常。成员不会被创建,但它是在静默中发生的。

代码语言:javascript
复制
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 }

为什么有人想要这种静默行为,为什么不抛出异常?

EN

回答 2

Stack Overflow用户

发布于 2013-12-02 02:57:22

对密封对象的赋值行为会随着浏览器的不同而变化。例如,最新发布的chrome的行为可能与您预期的一样。出于实际目的,可以安全地假设,向密封对象添加成员仅在严格模式下引发异常。

代码语言:javascript
复制
;(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”异常,但在调用时会静默失败。

从文档中:

除非您依赖于此方法的安全性和安全性规定,否则这应该没有问题,而这些规定在传统引擎中是不可能获得的。

票数 4
EN

Stack Overflow用户

发布于 2013-12-03 01:33:10

对不可扩展对象的不存在属性的赋值被指定为引发,但仅当该赋值包含在严格模式代码中时才会引发。请参阅ES5.1 Annex C的第四个项目符号。

如果你想确保你得到一个异常,确保你用"use strict“标记你的代码;

这样的赋值不会抛出非严格代码的原因是为了保持与符合ECMAScript标准的ES3 (或更早的)版本的代码的向后兼容性。可扩展/不可扩展的概念在ES5出现之前是不存在的,但是一些实现可能公开了不能添加属性的主机对象(即DOM对象)。使用ES3语义,对这些对象的赋值不会抛出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20315906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档