如果在冻结对象后添加新属性,则抛出错误

时间:2016-05-13 22:13:37

标签: javascript node.js

使用JavaScript / Node.js,如果对象在被冻结后被修改,是否可能抛出错误?我想在对象上放置一个不可变属性,并防止重新分配该对象。

在这种情况下,我正在编写一个库,我需要赋值module.exports = x;是不可变的。

我想阻止用户向x添加属性以及阻止重新分配module.exports。不仅如此,如果用户尝试上述操作,我想抛出错误而不是无声错误,是否可能?

2 个答案:

答案 0 :(得分:2)

如果用户代码在严格模式下运行,它将自动抛出错误。



function log(obj) {
  document.querySelector('pre').innerText += JSON.stringify(obj, null, 2) + '\n';
}

function nonStrict(obj) {
  obj.b = 2;
  log(obj);
}

function strict(obj) {
  'use strict';
  try {
    obj.b = 2;
  } catch(e) {
    log(e.message);
  }
}

var obj = {
  a: 1
};
Object.freeze(obj);
nonStrict(obj);
strict(obj);

<pre></pre>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

您可以使用Object.freeze(x);

例如在模块foo.js

var foo = {id: 42};

Object.freeze(foo);

module.exports = foo;

在模块bar.js中,您收到错误。

'use strict';

var foo = require('./foo');

foo.bar = 42; // TypeError: Can't add property bar, object is not extensible

请注意,要抛出错误,您需要使用严格模式。如果你不使用它,对象将继续是不可变的,但它不会抛出错误。