TypeError: kann das Prototyp dieses Objekts nicht festlegen

Der JavaScript-Ausnahmefehler "kann das Prototyp dieses Objekts nicht festlegen" tritt auf, wenn versucht wird, das Prototyp eines Objekts festzulegen, das jedoch gesperrt ist. Dies kann der Fall sein, wenn es sich um ein eingebautes unveränderliches Prototyp-Objekt handelt oder das Objekt nicht erweiterbar ist.

Meldung

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)

Fehlertyp

Was ist schiefgelaufen?

Sie verwenden eine der Prototyp-verändernden Methoden—insbesondere Object.setPrototypeOf()—auf einem Objekt, dessen Prototyp unveränderlich ist. Einige eingebaute Objekte haben aus Sicherheitsgründen unveränderliche Prototypen, wie Object.prototype und window. Benutzerdefinierte Objekte können Prototyp-Veränderungen verhindern, indem Object.preventExtensions(), Object.seal(), oder Object.freeze() verwendet wird.

Beispiele

Änderung des Prototyps eines eingebauten Objekts

Einige wenige eingebaute Objekte besitzen unveränderliche Prototypen. Zum Beispiel können Sie den Prototyp von Object.prototype nicht ändern:

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

Dies verhindert, dass das Verhalten aller Objekte im System willkürlich geändert wird. Der Prototyp von Object.prototype ist immer null. Andere eingebaute Prototyp-Objekte wie Function.prototype und Array.prototype sind in dieser Hinsicht jedoch standardmäßig nicht geschützt.

Änderung des Prototyps eines nicht-erweiterbaren Objekts

Wenn Sie ein Objekt nicht-erweiterbar machen, können Sie seinen Prototyp ebenfalls nicht ändern:

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

Siehe auch