handler.getPrototypeOf()
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Januar 2020 browserübergreifend verfügbar.
Die handler.getPrototypeOf() Methode ist eine Falle für die [[GetPrototypeOf]] objektinterne Methode, die von Operationen wie Object.getPrototypeOf() verwendet wird.
Probieren Sie es aus
const monster = {
eyeCount: 4,
};
const monsterPrototype = {
eyeCount: 2,
};
const handler = {
getPrototypeOf(target) {
return monsterPrototype;
},
};
const proxy = new Proxy(monster, handler);
console.log(Object.getPrototypeOf(proxy) === monsterPrototype);
// Expected output: true
console.log(Object.getPrototypeOf(proxy).eyeCount);
// Expected output: 2
Syntax
new Proxy(target, {
getPrototypeOf(target) {
}
})
Parameter
Der folgende Parameter wird an die getPrototypeOf() Methode übergeben. this ist an den Handler gebunden.
target-
Das Zielobjekt.
Rückgabewert
Die getPrototypeOf() Methode muss ein Objekt oder null zurückgeben, das das Prototyp des Zielobjekts darstellt.
Beschreibung
>Abfangvorgänge
Diese Falle kann folgende Operationen abfangen:
Object.getPrototypeOf()Reflect.getPrototypeOf()__proto__Object.prototype.isPrototypeOf()instanceof
Oder jede andere Operation, die die [[GetPrototypeOf]] interne Methode aufruft.
Invarianten
Die [[GetPrototypeOf]] interne Methode des Proxys löst einen TypeError aus, wenn die Handlerdefinition eine der folgenden Invarianten verletzt:
- Das Ergebnis muss entweder ein
Objectodernullsein. - Wenn das Zielobjekt nicht erweiterbar ist (das heißt,
Reflect.isExtensible()gibtfalsefürtargetzurück), muss das Ergebnis das gleiche sein wie das Ergebnis vonReflect.getPrototypeOf(target).
Beispiele
>Grundlegende Verwendung
const obj = {};
const proto = {};
const handler = {
getPrototypeOf(target) {
console.log(target === obj); // true
console.log(this === handler); // true
return proto;
},
};
const p = new Proxy(obj, handler);
console.log(Object.getPrototypeOf(p) === proto); // true
Fünf Möglichkeiten, die getPrototypeOf-Falle auszulösen
const obj = {};
const p = new Proxy(obj, {
getPrototypeOf(target) {
return Array.prototype;
},
});
console.log(
Object.getPrototypeOf(p) === Array.prototype, // true
Reflect.getPrototypeOf(p) === Array.prototype, // true
p.__proto__ === Array.prototype, // true
Array.prototype.isPrototypeOf(p), // true
p instanceof Array, // true
);
Zwei Arten von Ausnahmen
const obj = {};
const p = new Proxy(obj, {
getPrototypeOf(target) {
return "foo";
},
});
Object.getPrototypeOf(p); // TypeError: "foo" is not an object or null
const obj2 = Object.preventExtensions({});
const p2 = new Proxy(obj2, {
getPrototypeOf(target) {
return {};
},
});
Object.getPrototypeOf(p2); // TypeError: expected same prototype value
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-proxy-object-internal-methods-and-internal-slots-getprototypeof> |