使用JavaScript / Node.js,如果对象在被冻结后被修改,是否可能抛出错误?我想在对象上放置一个不可变属性,并防止重新分配该对象。
在这种情况下,我正在编写一个库,我需要赋值module.exports = x;
是不可变的。
我想阻止用户向x添加属性以及阻止重新分配module.exports。不仅如此,如果用户尝试上述操作,我想抛出错误而不是无声错误,是否可能?
答案 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;
答案 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
请注意,要抛出错误,您需要使用严格模式。如果你不使用它,对象将继续是不可变的,但它不会抛出错误。