Spec-Zone.ru › JavaScript

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"

Спецификации

Спецификация
Спецификация языка ECMAScript® 2027
# sec-method-definitions

Совместимость с браузерами

Десктоп Мобильные Сервер
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

См. также

  • Руководство по работе с объектами
  • Функции
  • get
  • Object.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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API