Javascript 当有人试图对我冻结的对象进行变异时,我如何抛出自定义错误?

Javascript 当有人试图对我冻结的对象进行变异时,我如何抛出自定义错误?,javascript,object,freeze,Javascript,Object,Freeze,我需要冻结一个对象/数组,这样它就不会以任何方式发生变异Object.freeze()近乎完美: const arr = []; const obj = { foo: "bar" }; let frozenArr = Object.freeze(arr); let frozenObj = Object.freeze(obj); // Uncaught TypeError: Cannot add property 0, object is not extensible frozenArr.pus

我需要冻结一个对象/数组,这样它就不会以任何方式发生变异
Object.freeze()
近乎完美:

const arr = [];
const obj = { foo: "bar" };
let frozenArr = Object.freeze(arr);
let frozenObj = Object.freeze(obj);

// Uncaught TypeError: Cannot add property 0, object is not extensible
frozenArr.push('abc');

// Uncaught TypeError: Cannot add property x, object is not extensible
frozenObj.x = 'abc';
问题是,我想抛出一个自定义错误,向开发人员解释对象冻结的原因、如何处理等等。


我曾考虑使用
代理
Object.defineProperties()
并在setter中手动抛出错误,但我不想重新发明轮子,因此我的问题在这里。可能有人已经有了解决方案。

我建议不要这样做,你会抛弃其他程序员,因为他们知道是什么引发了特定的错误。嗯,更改错误就像将
.push()
包装在try/catch块中并引发自定义错误一样简单。如果您在冻结的对象周围定义了一个瘦包装类,那么可以使用setter来确保对
.push()
的任何调用或任何分配都通过try/catch块被重新路由。最困难的部分是确保开发人员不会冻结他们自己的对象,所以要么提供一个开发人员需要使用的函数来冻结。或覆盖Object.freeze。但这两种方法都不是一个好的解决方案,所以我会放弃它,只在文档中写入Object.freeze()错误。没有本机的“deep freeze”方法。您可能必须使用代理或库(例如)