We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Переклад не закінчено. Будь ласка, допоможіть перекласти цю статтю з англійської.

Оператор set прив'язує властивість об'єкта до функції, яка буде викликана під час спроби присвоїти значення даній властивості.

Синтаксис

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

Параметри

prop
Ім'я властивості, котра має бути прив'язана до даної функції.
val
Псевдонім змінної зі значенням,  для якого виконується спроба присвоїти його властивості prop.
expression
Починаючи від ECMAScript 2015 можна також використовувати вираз (expression) для вираховування імені властивості, до якої буде прив'язана дана функція.

Опис

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

Зауважте особливість використання синтаксису set:

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

Сетер можна усунути, використовуючи оператор delete.

Приклади

Надання значення сетерові під час ініціалізації нового об'єкта

Це надасть значення псевдо-властивості current об'єкта language,який під час присвоєння значення додасть його також у властивість log:

var language = {
  log: [],
  set current(name) {
    this.log.push(name);
  }  
}

language.current = 'UK';
console.log(language.log); // ['UK']

language.current = 'EN';
console.log(language.log); // ['UK', 'EN']

Зверніть увагу, що  властивість current не визначена, а будь-які спроби викликати її повернуть значення undefined.

Усування сетера за допомогою оператора delete

Якщо потрібно усунути сетер, це можна знобити помістивши оператор 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)
The definition of 'Object Initializer' in that specification.
Standard Initial definition.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Method definitions' in that specification.
Standard Added computed property names.
ECMAScript Latest Draft (ECMA-262)
The definition of 'Method definitions' in that specification.
Draft  

Сумісність з браузерами

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Властивість Chrome Edge Firefox (Gecko) Internet Explorer Opera Safari
Базова підтримка 1 (Yes) 2.0 (1.8.1) 9 9.5 3
Computed property names No support (Yes) 34 (34) No support No support No support
Властивість Android Chrome for Android Edge Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базова підтримка (Yes) (Yes) (Yes) 1.0 (1.8.1) (Yes) (Yes) (Yes)
Computed property names No support No support ? 34.0 (34.0) No support No support No support

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 ES2015 specification.

See also

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

Зробили внесок у цю сторінку: codermeister, trofima
Востаннє оновлена: codermeister,