handler.setPrototypeOf()
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с сентября 2016 года.
Метод handler.setPrototypeOf() является ловушкой для внутреннего метода объекта [[SetPrototypeOf]], который используется такими операциями, как Object.setPrototypeOf().
Попробуйте
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
Синтаксис
new Proxy(target, {
setPrototypeOf(target, prototype) {
}
})
Параметры
Следующие параметры передаются методу setPrototypeOf(). this привязан к обработчику.
-
target - Целевой объект.
-
prototype - Новый прототип объекта или
null.
Возвращаемое значение
Метод setPrototypeOf() должен возвращать Boolean, указывающий, успешно ли изменен прототип. Другие значения приводятся к булевым значениям.
Многие операции, включая Object.setPrototypeOf(), выбрасывают TypeError, если внутренний метод [[SetPrototypeOf]] возвращает false.
Описание
Перехваты
Эта ловушка может перехватывать следующие операции:
Или любую другую операцию, которая вызывает внутренний метод [[SetPrototypeOf]].
Инварианты
Внутренний метод [[SetPrototypeOf]] прокси выбрасывает TypeError, если определение обработчика нарушает один из следующих инвариантов:
- Если целевой объект не является расширяемым, прототип нельзя изменить. То есть, если
Reflect.isExtensible()возвращаетfalseдляtarget, иprototypeне совпадает с результатомReflect.getPrototypeOf(target), то ловушка должна вернуть ложное значение.
Примеры
Если вы хотите запретить установку нового прототипа для вашего объекта, метод setPrototypeOf() вашего обработчика может вернуть false или выбросить исключение.
Подход 1: Возврат false
Этот подход означает, что любая мутирующая операция, которая выбрасывает исключение при сбое мутации, должна сама создать исключение.
Например, Object.setPrototypeOf() сам создаст и выбросит TypeError. Если мутация выполняется операцией, которая обычно не выбрасывает исключение при сбое, такой как Reflect.setPrototypeOf(), исключение не будет выброшено.
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
Подход 2: Выбрасывание исключения
Последний подход приведет к тому, что любая операция, пытающаяся выполнить мутацию, выбросит исключение. Этот подход лучше всего подходит, если вы хотите, чтобы даже не выбрасывающие исключения операции выбрасывали их при сбое, или вы хотите выбросить собственное значение исключения.
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")
Спецификации
| Спецификация |
|---|
| Спецификация языка ECMAScript® 2027 # sec-proxy-object-internal-methods-and-internal-slots-setprototypeof-v |
Совместимость с браузерами
| Настольные компьютеры | Мобильные устройства | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | WebView на iOS | Bun | Deno | Node.js | |
setPrototypeOf |
49 |
12 |
49 |
36 |
10 |
49 |
49 |
36 |
10 |
5.0 |
49 |
10 |
1.0.0 |
1.0 |
6.0.0 |
См. также
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/setPrototypeOf