setter

Оператор set связывает свойство объекта с функцией, которая будет вызвана при попытке установить это свойство.

Синтаксис

{set prop(val) { . . . }}
{set [expression](val) { . . . }}

Параметры

prop
Имя свойства для привязки к заданной функции.
val
Псевдоним переменной, которая хранит значение, неудавшегося определения prop.
expression
Начиная с ECMAScript 6, вы также можете использовать выражения для вычисляемого имя свойства для привязки к данной функции.

Описание

В JavaScript, сеттер можно использовать для выполнения функции, когда будет попытка изменения указанного свойства. Сеттеры используются чаще всего в сочетании с геттерами для создания одного из видов псевдо-свойства. Невозможно одновременно иметь сеттер для свойства, которое содержит фактическое значение.

Обратите внимание на следующие моменты при работе с синтаксисом set:

  • Он может иметь идентификатор, который является либо числом, либо строкой;
  • Он должен иметь ровно один параметр (смотрите Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments для более подробной информации);
  • Он не должен объявляться в литерале объекта, с другим набором или вводом данных для того же самого свойства.
    ( { set x(v) { }, set x(v) { } } и { x: ..., set x(v) { } } запрещены)

Сеттер может быть удален оператором delete.

Примеры

Определение сеттера при инициализации новых объектов

Это позволит определить псевдо-параметр current объекта o, который задает значение, обновляющее значение log:

var o = {
  set current (str) {
    this.log[this.log.length] = str;
  },
  log: []
}

обратите внимание, что current не определен и любые попытки доступа к нему вернут undefined.

Удаление сеттера оператором delete

Если вы хотите удалить сеттер, вы можете просто его удалить:

delete o.current;

Определение сеттера для существующих объектов используя defineProperty

Чтобы добавить сеттер на существующий объект в любое время, используйте Object.defineProperty().

var o = { a:0 };

Object.defineProperty(o, "b", { set: function (x) { this.a = x / 2; } });

o.b = 10; // Запускает сеттер, который присваивает 10 / 2 (5) свойству 'a'
console.log(o.a) // 5

Использование вычисляемого имени свойства 

var expr = "foo";

var obj = {
  baz: "bar",
  set [expr](v) { this.baz = v; }
};

console.log(obj.baz); // "bar"
obj.foo = "baz";      // запускает сеттер
console.log(obj.baz); // "baz"

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

Спецификация Статус Комментарий
ECMAScript 5.1 (ECMA-262)
Определение 'Object Initializer' в этой спецификации.
Стандарт Начальное определение.
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Method definitions' в этой спецификации.
Стандарт Добавлены вычесляемые имена свойств
ECMAScript Latest Draft (ECMA-262)
Определение 'Method definitions' в этой спецификации.
Черновик  

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

Update compatibility data on GitHub
КомпьютерыМобильныеServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome для AndroidFirefox для AndroidOpera для AndroidSafari on iOSSamsung InternetNode.js
setChrome Полная поддержка 1Edge Полная поддержка 12Firefox Полная поддержка 2IE Полная поддержка 9Opera Полная поддержка 9.5Safari Полная поддержка 3WebView Android Полная поддержка 1Chrome Android Полная поддержка 18Firefox Android Полная поддержка 4Opera Android Полная поддержка ДаSafari iOS Полная поддержка ДаSamsung Internet Android Полная поддержка 1.0nodejs Полная поддержка Да
Computed property namesChrome Полная поддержка 46Edge Полная поддержка 12Firefox Полная поддержка 34IE Нет поддержки НетOpera Полная поддержка 47Safari Нет поддержки НетWebView Android Полная поддержка 46Chrome Android Полная поддержка 46Firefox Android Полная поддержка 34Opera Android Полная поддержка ДаSafari iOS Нет поддержки НетSamsung Internet Android Полная поддержка 5.0nodejs Полная поддержка Да

Легенда

Полная поддержка  
Полная поддержка
Нет поддержки  
Нет поддержки

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