TypeError: can't set prototype of this object
JavaScript 异常“无法设置此对象的原型”发生在尝试设置对象的原型时,但该对象的原型是冻结的,原因可能是它是一个内置的不可变原型对象,或者它不可扩展。
消息
TypeError: Immutable prototype object 'Object.prototype' cannot have their prototype set (V8-based) TypeError: #<Object> is not extensible (V8-based) TypeError: can't set prototype of this object (Firefox) TypeError: Cannot set prototype of immutable prototype object (Safari) TypeError: Attempted to assign to readonly property. (Safari)
错误类型
TypeError
哪里出错了?
你正在对一个原型不可变的对象使用其中一种原型修改方法——最值得注意的是 Object.setPrototypeOf()。出于安全原因,一些内置对象具有不可变的原型,例如 Object.prototype 和 window。用户对象也可以通过使用 Object.preventExtensions()、Object.seal() 或 Object.freeze() 来防止原型更改。
示例
更改内置对象的原型
少数内置对象具有不可变的原型。例如,你不能更改 Object.prototype 的原型。
js
Object.setPrototypeOf(Object.prototype, {});
这可以防止你随意更改系统中所有对象的行为。Object.prototype 的原型始终为 null。然而,其他内置原型对象,例如 Function.prototype 和 Array.prototype,默认情况下在这方面不受保护。
更改不可扩展对象的原型
如果你使对象不可扩展,你也无法更改其原型。
js
const obj = {};
Object.preventExtensions(obj);
Object.setPrototypeOf(obj, {});
// TypeError: can't set prototype of this object