Spec-Zone.ru › JavaScript

Object.prototype.__defineSetter__()

Базовый уровень Ограниченная доступность

Эта функция не относится к Базовому уровню, поскольку она не работает в некоторых из наиболее широко используемых браузеров.

Устарело: Эта функция больше не рекомендуется. Хотя некоторые браузеры могут всё ещё её поддерживать, она, возможно, уже была удалена из соответствующих веб-стандартов, находится в процессе удаления или сохраняется только для целей совместимости. Избегайте её использования и обновите существующий код, если это возможно; см. таблицу совместимости в нижней части этой страницы, чтобы принять решение. Имейте в виду, что эта функция может перестать работать в любой момент.

Примечание: Эта функция устарела в пользу определения сеттеров (setters) с использованием синтаксиса инициализатора объекта или API Object.defineProperty(). Поведение этого метода указано только для веб-совместимости и не требуется для реализации на любой платформе. Он может работать не везде.

Метод __defineSetter__() экземпляров Object привязывает свойство объекта к функции, которая будет вызвана при попытке установить это свойство.

Синтаксис

__defineSetter__(prop, func)

Параметры

prop
Строка, содержащая имя свойства, к которому привязан сеттер func.
func
Функция, которая будет вызвана при попытке установить указанное свойство. Эта функция принимает следующий параметр:
val
Значение, которое пытались присвоить prop.

Возвращаемое значение

Нет (undefined).

Исключения

TypeError
Выбрасывается, если func не является функцией.

Описание

Все объекты, которые наследуются от Object.prototype (то есть, все, кроме объектов с null-прототипом), наследуют метод __defineSetter__(). Этот метод позволяет определить сеттер для уже существующего объекта. Это эквивалентно Object.defineProperty(obj, prop, { set: func, configurable: true, enumerable: true }), что означает, что свойство является перечисляемым (enumerable) и конфигурируемым (configurable), и любой существующий геттер, если он присутствует, сохраняется.

__defineSetter__() определяется в спецификации как "нормативно необязательный" ("normative optional"), что означает, что не требуется никаких реализаций для его включения. Однако все основные браузеры реализуют его, и благодаря его постоянному использованию, маловероятно, что он будет удален. Если браузер реализует __defineSetter__(), ему также необходимо реализовать методы __lookupGetter__(), __lookupSetter__() и __defineGetter__().

Примеры

Использование __defineSetter__()

const o = {};
o.__defineSetter__("value", function (val) {
  this.anotherValue = val;
});
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

Определение свойства-сеттера стандартными способами

Вы можете использовать синтаксис set для определения сеттера при первой инициализации объекта.

const o = {
  set value(val) {
    this.anotherValue = val;
  },
};
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

Вы также можете использовать Object.defineProperty() для определения сеттера для объекта после его создания. По сравнению с __defineSetter__(), этот метод позволяет вам контролировать перечисляемость (enumerability) и конфигурируемость (configurability) сеттера, а также определять свойства символов. Метод Object.defineProperty() также работает с объектами с null-прототипом, которые не наследуются от Object.prototype и, следовательно, не имеют метода __defineSetter__().

const o = {};
Object.defineProperty(o, "value", {
  set(val) {
    this.anotherValue = val;
  },
  configurable: true,
  enumerable: true,
});
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-object.prototype.__defineSetter__

Совместимость с браузерами

Настольные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
defineSetter
1
12
1Начиная с Firefox 48, этот метод больше не может быть вызван в глобальной области видимости без какого-либо объекта. В противном случае будет выброшено TypeError. Ранее в таких случаях автоматически использовался глобальный объект, но это больше не так.
9.5
3
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

Смотрите также

  • Полифилл Object.prototype.__defineSetter__ в core-js
  • Object.prototype.__defineGetter__()
  • set
  • Object.defineProperty()
  • Object.prototype.__lookupGetter__()
  • Object.prototype.__lookupSetter__()
  • Руководство JS: Определение геттеров и сеттеров
  • Баг Firefox 647423

© 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/Object/__defineSetter__

Spec-Zone.ru

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