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
Спецификации
Совместимость с браузерами
| Настольные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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__()setObject.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__