handler.getPrototypeOf()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Januar 2020.
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
Object
odernull
sein. - Wenn das Zielobjekt nicht erweiterbar ist (das heißt,
Reflect.isExtensible()
gibtfalse
fürtarget
zurü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
Specification |
---|
ECMAScript® 2026 Language Specification> # sec-proxy-object-internal-methods-and-internal-slots-getprototypeof> |
Browser-Kompatibilität
Loading…