Spec-Zone.ru › JavaScript

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.

Описание

Перехваты

Эта ловушка может перехватывать следующие операции:

  • Object.setPrototypeOf()
  • Reflect.setPrototypeOf()

Или любую другую операцию, которая вызывает внутренний метод [[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

См. также

  • Proxy
  • Proxy() конструктор
  • Object.setPrototypeOf()
  • Reflect.setPrototypeOf()

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API