Переклад не закінчено. Будь ласка, допоможіть перекласти цю статтю з англійської.
Оператор 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 |
Сумісність з браузерами
| Властивість | 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
SyntaxErroras per the ES2015 specification.
See also
- getter
deleteObject.defineProperty()__defineGetter____defineSetter__- Defining Getters and Setters in JavaScript Guide

