假设我在 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/