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.prototypewindow。用户对象也可以通过使用 Object.preventExtensions()Object.seal()Object.freeze() 来防止原型更改。

示例

更改内置对象的原型

少数内置对象具有不可变的原型。例如,你不能更改 Object.prototype 的原型。

js
Object.setPrototypeOf(Object.prototype, {});

这可以防止你随意更改系统中所有对象的行为。Object.prototype 的原型始终为 null。然而,其他内置原型对象,例如 Function.prototypeArray.prototype,默认情况下在这方面不受保护。

更改不可扩展对象的原型

如果你使对象不可扩展,你也无法更改其原型。

js
const obj = {};
Object.preventExtensions(obj);
Object.setPrototypeOf(obj, {});
// TypeError: can't set prototype of this object

另见