set
Baseline Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Синтаксис set связывает свойство объекта с функцией, которая будет вызвана при попытке установить это свойство. Его также можно использовать в классах.
Попробуйте
const language = {
set current(name) {
this.log.push(name);
},
log: [],
};
language.current = "EN";
language.current = "FA";
console.log(language.log);
// Expected output: Array ["EN", "FA"]
Синтаксис
{ set prop(val) { /* … */ } }
{ set [expression](val) { /* … */ } }
Существуют некоторые дополнительные ограничения синтаксиса:
- У сеттера должен быть ровно один параметр.
Параметры
-
prop - Имя свойства, которое будет связано с данной функцией. Как и другие свойства в инициализаторах объектов, оно может быть строковым литералом, числовым литералом или идентификатором.
-
val - Псевдоним переменной, которая содержит значение, пытающееся быть присвоенным
prop. -
expression - Вы также можете использовать выражения для вычисляемого имени свойства, чтобы связать его с данной функцией.
Описание
В JavaScript сеттер может использоваться для выполнения функции при каждой попытке изменить значение свойства. Сеттеры чаще всего используются совместно с геттерами.
Свойство объекта является либо свойством данных, либо свойством-аксессором, но оно не может быть одновременно и тем, и другим. Читайте Object.defineProperty() для получения дополнительной информации. Синтаксис сеттера позволяет указать функцию сеттера в инициализаторе объекта.
const obj = {
set prop(val) {
// setter, the code executed when setting obj.prop
},
};
Свойства, определенные с использованием этого синтаксиса, являются собственными свойствами созданного объекта и являются настраиваемыми и перечисляемыми.
Примеры
Определение сеттера для новых объектов в инициализаторах объектов
Следующий пример определяет псевдо-свойство current объекта language. Когда current присваивается значение, оно обновляет log этим значением:
const language = {
set current(name) {
this.log.push(name);
},
log: [],
};
language.current = "EN";
console.log(language.log); // ['EN']
language.current = "FA";
console.log(language.log); // ['EN', 'FA']
Обратите внимание, что current не определено, и любые попытки доступа к нему приведут к undefined.
Использование сеттеров в классах
Вы можете использовать тот же самый синтаксис для определения общедоступных сеттеров экземпляров, доступных в экземплярах классов. В классах вам не нужен разделитель-запятая между методами.
class ClassWithGetSet {
#msg = "hello world";
get msg() {
return this.#msg;
}
set msg(x) {
this.#msg = `hello ${x}`;
}
}
const instance = new ClassWithGetSet();
console.log(instance.msg); // "hello world"
instance.msg = "cake";
console.log(instance.msg); // "hello cake"
Свойства сеттеров определяются в свойстве prototype класса и, следовательно, совместно используются всеми экземплярами класса. В отличие от свойств сеттеров в объектных литералах, свойства сеттеров в классах не являются перечисляемыми.
Статические сеттеры и приватные сеттеры используют похожие синтаксисы, которые описаны на страницах static и приватные элементы.
Удаление сеттера с помощью оператора delete
Если вы хотите удалить сеттер, вы можете просто delete его:
delete language.current;
Определение сеттера для существующих объектов с помощью defineProperty
Чтобы добавить сеттер к существующему объекту, используйте Object.defineProperty().
const o = { a: 0 };
Object.defineProperty(o, "b", {
set(x) {
this.a = x / 2;
},
});
o.b = 10;
// Runs the setter, which assigns 10 / 2 (5) to the 'a' property
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";
// Run the setter
console.log(obj.baz); // "baz"
Спецификации
Совместимость с браузерами
| Десктоп | Мобильные | Сервер | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
set |
1 |
12 |
1.5 |
9.5 |
3 |
18 |
4 |
14 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
computed_property_names |
46 |
12 |
34 |
47 |
9.1 |
46 |
34 |
33 |
9.3 |
5.0 |
46 |
9.3 |
1.0.0 |
1.0 |
4.0.0 |
См. также
- Руководство по работе с объектами
- Функции
getObject.defineProperty()- Инициализатор объекта
class- Аксессоры свойств
- Несовместимое изменение ES5: литералы функций геттера и сеттера теперь должны иметь ровно ноль или один аргумент от Jeff Walden (2010)
- Еще изменения SpiderMonkey: древний, эзотерический, редко используемый синтаксис для создания геттеров и сеттеров удаляется от Jeff Walden (2010)
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set