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 September 2016.
Die Methode handler.getPrototypeOf()
ist eine Falle für die [[GetPrototypeOf]]
interne Objektmethode, die von Operationen wie Object.getPrototypeOf()
verwendet wird.
Probieren Sie es aus
Syntax
new Proxy(target, {
getPrototypeOf(target) {
}
})
Parameter
Der folgende Parameter wird an die Methode getPrototypeOf()
übergeben. this
ist an den Handler gebunden.
target
-
Das Zielobjekt.
Rückgabewert
Die Methode getPrototypeOf()
muss ein Objekt oder null
zurückgeben, das das Prototype des Zielobjekts darstellt.
Beschreibung
Abfangmöglichkeiten
Diese Falle kann die folgenden 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 wirft einen TypeError
, wenn die Handler-Definition 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 dasselbe 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 Wege, um 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 Language Specification # sec-proxy-object-internal-methods-and-internal-slots-getprototypeof |
Browser-Kompatibilität
BCD tables only load in the browser