handler.setPrototypeOf()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.
Die handler.setPrototypeOf()
Methode ist eine Trap für die [[SetPrototypeOf]]
interne Objektmethode, die von Operationen wie Object.setPrototypeOf()
verwendet wird.
Probieren Sie es aus
const handler = {
setPrototypeOf(monster, monsterProto) {
monster.geneticallyModified = true;
return false;
},
};
const monsterProto = {};
const monster = {
geneticallyModified: false,
};
const proxy = new Proxy(monster, handler);
// Object.setPrototypeOf(proxy, monsterProto); // Throws a TypeError
console.log(Reflect.setPrototypeOf(proxy, monsterProto));
// Expected output: false
console.log(monster.geneticallyModified);
// Expected output: true
Syntax
new Proxy(target, {
setPrototypeOf(target, prototype) {
}
})
Parameter
Die folgenden Parameter werden an die setPrototypeOf()
Methode übergeben. this
ist an den Handler gebunden.
Rückgabewert
Die setPrototypeOf()
Methode muss ein Boolean
zurückgeben, das angibt, ob das Prototyp erfolgreich geändert wurde oder nicht. Andere Werte werden zu Booleans gezwungen.
Viele Operationen, einschließlich Object.setPrototypeOf()
, werfen einen TypeError
, wenn die [[SetPrototypeOf]]
interne Methode false
zurückgibt.
Beschreibung
>Abfangvorgänge
Diese Trap kann diese Operationen abfangen:
Oder jede andere Operation, die die [[SetPrototypeOf]]
interne Methode aufruft.
Invarianten
Die [[SetPrototypeOf]]
interne Methode des Proxies wirft einen TypeError
, wenn die Handler-Definition eine der folgenden Invarianten verletzt:
- Wenn das Zielobjekt nicht erweiterbar ist, kann das Prototyp nicht geändert werden. Das heißt, wenn
Reflect.isExtensible()
false
auftarget
zurückgibt undprototype
nicht mit dem Ergebnis vonReflect.getPrototypeOf(target)
identisch ist, muss die Trap einen falsy-Wert zurückgeben.
Beispiele
Wenn Sie verhindern möchten, dass ein neues Prototyp für Ihr Objekt gesetzt wird, kann Ihr Handler die
setPrototypeOf()
Methode entweder false
zurückgeben oder eine Ausnahme werfen.
Ansatz 1: Zurückgeben von false
Dieser Ansatz bedeutet, dass jede ändernde Operation, die im Falle eines Fehlschlags eine Ausnahme wirft, die Ausnahme selbst erstellen muss.
Zum Beispiel wird Object.setPrototypeOf()
selbst eine
TypeError
erstellen und werfen. Wenn die Mutation durch eine Operation durchgeführt wird, die im Falle eines Fehlschlags normalerweise keine Ausnahme wirft, wie z.B.
Reflect.setPrototypeOf()
, wird keine Ausnahme geworfen.
const handlerReturnsFalse = {
setPrototypeOf(target, newProto) {
return false;
},
};
const newProto = {},
target = {};
const p1 = new Proxy(target, handlerReturnsFalse);
Object.setPrototypeOf(p1, newProto); // throws a TypeError
Reflect.setPrototypeOf(p1, newProto); // returns false
Ansatz 2: Werfen einer Ausnahme
Der letztere Ansatz wird dazu führen, dass jede Operation, die versucht zu mutieren, eine Ausnahme wirft. Dieser Ansatz ist am besten, wenn Sie wollen, dass selbst nicht-werfende Operationen im Falle eines Fehlschlags eine Ausnahme werfen, oder wenn Sie einen benutzerdefinierten Ausnahme-Wert werfen möchten.
const handlerThrows = {
setPrototypeOf(target, newProto) {
throw new Error("custom error");
},
};
const newProto = {},
target = {};
const p2 = new Proxy(target, handlerThrows);
Object.setPrototypeOf(p2, newProto); // throws new Error("custom error")
Reflect.setPrototypeOf(p2, newProto); // throws new Error("custom error")
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification> # sec-proxy-object-internal-methods-and-internal-slots-setprototypeof-v> |
Browser-Kompatibilität
Loading…