сетер
Оператор set
прив'язує властивість об'єкта до функції, яка буде викликана під час спроби присвоїти значення даній властивості.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Синтаксис
{set prop(val) { . . . }} {set [expression](val) { . . . }}
Параметри
prop
- Ім'я властивості, котра має бути прив'язана до даної функції.
val
- Псевдонім змінної, що містить значення, для якого виконується спроба присвоїти його властивості
prop
. - expression
- Починаючи від ECMAScript 2015, можна також використовувати вираз для обчислюваного імені властивості, до якої буде прив'язана дана функція.
Опис
У JavaScript сетер можна використати для виконання функції під час здійснення спроби змінити певну властивість. Найчастіше сетери використовуються у поєднанні з ґетерами для створення свого роду псевдовластивостей. Не можна водночас мати сетера на властивості, яка містить фактичне значення.
Зауважте особливість використання синтаксису set
:
- Він може мати ідентифікатор, який є або числом, або рядком;
- Він повинен мати рівно один параметр (дивіться більше інформації у статті Несумісна зміна ES5: літеральні функції гетерів та сетерів тепер повинні мати рівно нуль аргументів та один аргумент);
- Він не повинен з'являтись у об'єктному літералі з іншим сетером чи введеними даними для тієї ж властивості.
({ set x(v) { }, set x(v) { } }
та{ x: ..., set x(v) { } }
заборонені)
Приклади
Визначення сетерів на нових об'єктах у об'єктних ініціалізаторах
Наступний код визначає псевдовластивість current
об'єкта language
. Коли current
присвоюється значення, це змінює log
на таке саме значення:
const language = {
set current(name) {
this.log.push(name);
},
log: []
}
language.current = 'EN';
console.log(language.log); // ['EN']
language.current = 'UA';
console.log(language.log); // ['EN', 'UA']
Зверніть увагу, що властивість current
не визначена, і будь-які спроби звернутись до неї повернуть значення undefined
.
Видалення сетера оператором delete
Якщо вам потрібно прибрати сетер, ви можете його просто видалити
:
delete o.current;
Визначення сетера на існуючому об'єкті за допомогою defineProperty
Щоб додати сетер до існуючого об'єкта, використовуйте Object.defineProperty()
.
const 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
Використання обчислюваного імені властивості
const expr = 'foo';
const obj = {
baz: 'bar',
set [expr](v) { this.baz = v; }
};
console.log(obj.baz);
// "bar"
obj.foo = 'baz';
// запустити сетер
console.log(obj.baz);
// "baz"
Специфікації
Сумісність з веб-переглядачами
BCD tables only load in the browser
Див. також
- гетер
delete
Object.defineProperty()
__defineGetter__
__defineSetter__
- Визначення гетерів та сетерів у посібнику JavaScript