将新属性添加到给定对象时,有没有办法让Javascript抛出错误?

时间:2012-06-14 23:30:46

标签: javascript ecmascript-5

Object.preventExtensionsObject.seal可以防止将未知属性添加到对象中,但这些属性会以静默方式失败而不是抛出错误。有没有办法强迫他们出错?

var myObj = Object.seal({});
try{
    myObj.someProp = 17;
    console.log("I don't want to reach this message");
}catch(err){
    console.log("I want an error to occur instead.")
    console.log("Or at least get a warning somewhere.");
}

我在Chrome 19和Firefox 9中对此进行了测试。我也不介意浏览器特定的解决方案,因为我在开发过程中只需要这个。

2 个答案:

答案 0 :(得分:1)

如果选择严格模式,Object.seal似乎可以解决问题(至少在Firefox中):

  

尝试删除或向密封对象添加属性,或者将数据属性转换为访问者或反之亦然,将无声或者通过抛出TypeError(最常见,尽管不是唯一的,在严格模式代码中)失败

效果很好:http://jsfiddle.net/yVWr6/

(顺便说一句:对于preventExtensions()的工作方式相同)

答案 1 :(得分:1)

根据MDN documentation for Object.seal()(和Object.freeze()),如果启用严格模式,则在尝试修改密封对象时将抛出TypeError:

function go() {
  'use strict';
  var x = {};
  Object.seal(x);
  x.foo = 123;
}
go(); // => TypeError: Can't add property foo, object is not extensible