В процессе перевода.

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

Syntax

{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

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

Note: Вычисляемые свойства  — это экспериментальная технология, часть предложения ECMAScript 6, и пока ещё не поддерживается широко браузерами. Это вызовет синтаксическую ошибку в неподдержиющих свойство окружениях.

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"

Specifications

Specification Status Comment
ECMAScript 5.1 (ECMA-262)
Определение 'Object Initializer' в этой спецификации.
Стандарт Initial definition.
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Method definitions' в этой спецификации.
Стандарт Added computed property names.
ECMAScript Latest Draft (ECMA-262)
Определение 'Method definitions' в этой спецификации.
Живой стандарт  

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 1 2.0 (1.8.1) 9 9.5 3
Computed property names Нет 34 (34) Нет Нет Нет
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Да) (Да) 1.0 (1.8.1) (Да) (Да) (Да)
Computed property names Нет Нет 34.0 (34.0) Нет Нет Нет

SpiderMonkey-specific notes

  • Starting with JavaScript 1.8.1, setters are no longer called when setting properties in object and array initializers.
  • From SpiderMonkey 38 on, a setter with a rest parameter is a SyntaxError as per the ES6 specification.

See also

Метки документа и участники

 Внесли вклад в эту страницу: PaulineNemchak, serzero2007, d4rkm3z
 Обновлялась последний раз: PaulineNemchak,