JavaScript:向密封对象添加属性会引发类型错误异常吗?

标签 javascript ecmascript-5

假设我在 JavaScript 中有这样的东西:

var obj = { name: "Luis" };
Object.seal( obj );

obj.address = "Fx"; //what should happen here?

那么,什么是正确的行为呢?它不是严格模式,所以我假设 obj.address 行将被忽略。然而,事实并非如此,因为它抛出了 Chrome。我正在查看 V8 的测试,看起来它应该只抛出严格模式:

object.seal测试代码:http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/object-seal.js?spec=svn7379&r=7379

这是该文件中的一些代码:

Object.seal(obj);

// Make sure we are no longer extensible.
assertFalse(Object.isExtensible(obj));
assertTrue(Object.isSealed(obj));

// We should not be frozen, since we are still able to
// update values.
assertFalse(Object.isFrozen(obj));

// We should not allow new properties to be added.
obj.foo = 42;
assertEquals(obj.foo, undefined);

顺便说一句,有严格模式下的测试,我的示例将清楚地抛出:http://code.google.com/p/v8/source/browse/branches/bleeding_edge/test/mjsunit/strict-mode.js?spec=svn7250&r=7250

有什么想法吗?

最佳答案

Object.seal 做了两件事。

1) 将对象的内部 [[Extensible]] 属性设置为 false。

2) 迭代对象自身的所有属性并将其内部 [[Configurable]] 属性设置为 false。

这几乎意味着在对象被密封后,您无法向其添加任何属性。请注意,只要对象未卡住(或者未将要分配的属性设置为显式不可写),现有属性仍然可以修改

在您的情况下,您要向密封对象添加另一个属性,因此在 ES5-non-strict 中它应该被忽略,而在 ES5-strict 中它应该导致 TypeError (正如您从 11.3.1 (Simple Assignment) 中看到的那样;更具体地说,您可以将其追踪到 [[CanPut]] ,在这种情况下,它几乎返回 [[Extensible]] 的值 — false — ,然后 [[Put ]] 要么抛出(如果是严格模式),要么抛出)。

所以不,Chrome 不应该在这里抛出异常(在非严格模式下)。

关于JavaScript:向密封对象添加属性会引发类型错误异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5478663/

相关文章:

java - 弱类型、自动装箱、扩大转换之间有什么区别?

javascript - 从 html 正文中删除除 <a>、<br>、<b> 和 <img> 之外的所有 HTML 标记

javascript - 新 ECMA5 Javascript 标准中的 argument.callee.name 替代方案

javascript - 使用固定参数的自定义顺序来 Currying Javascript 函数

Javascript:递归计算数组中所有元素的总和?

javascript - 在 Vue.js 中,这样写 v-on 是不是写错了?

javascript - jquery get() url作为变量的解决方法

javascript - MongoDB:如何填充嵌入式引用

javascript - 关闭时恢复幻灯片切换按钮文本

javascript - 当我实例化一个新类时使用 .call