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

Is there a way to have Javascript throw an error when a new property is added to a given object?

本文关键字:添加 对象 错误 出错 属性 Javascript 新属性 有没有      更新时间:2023-09-26

Object.preventExtensions 和 Object.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中对此进行了测试。我也不介意特定于浏览器的解决方案,因为我只在开发过程中需要它。

如果严格模式是一个选项,Object.seal 似乎可以解决问题(至少在 Firefox 中是这样):

尝试删除或向密封对象添加属性,或者将数据属性转换为访问器,反之亦然,将以静默方式失败,或者通过引发 TypeError(在严格模式代码中最常见,但不完全是

)。

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

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

根据 MDN 文档的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