В процессе перевода.
Синтаксис set
связывает свойство объекта с функцией, которая будет вызвана при попытке установить это свойство.
Syntax
{set prop(val) { . . . }} {set [expression](val) { . . . }}
Параметры
prop
- Имя свойства для привязки к заданной функции.
val
- Псевдоним переменной, которая хранит значение, неудавшегося определения
prop.
- expression
- Начиная с ECMAScript 6, вы также можете использовать выражения для вычисляемого имя свойства для привязки к данной функции.
Описание
В JavaScript, сеттер можно использовать для выполнения функции, когда будет попытка изменения указанного свойства. Сеттеры используются чаще всего в сочетании с геттерами для создания типа псевдо-собственности. Невозможно одновременно иметь сеттер для свойства, которое содержит фактическое значение.
Обратите внимание на следующие моменты при работе с синтаксисом set
:
- Он может иметь идентификатор, который является либо числом, либо строкой;
- Он должен иметь ровно один параметр (смотрите Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments для более подробной информации);
- Он не должен объявляться в литерале объекта, с другим набором или вводом данных для того же самого свойства.
({ set x(v) { }, set x(v) { } }
и{ x: ..., set x(v) { } }
запрещены)
Сеттер может быть удален оператором delete
.
Примеры
Определение сеттера при инициализации новых объектов
Это позволит определить псевдо-параметр current
объекта o
, который задает значение, обновляющее значение log
:
var o = { set current (str) { this.log[this.log.length] = str; }, log: [] }
обратите внимание, что current
не определен и любые попытки доступа к нему вернут undefined
.
Удаление сеттера оператором 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; // Runs the setter, which assigns 10 / 2 (5) to the 'a' property console.log(o.a) // 5
Using a computed property name
Note: Computed properties are experimental technology, part of the ECMAScript 6 proposal, and are not widely supported by browsers yet. This will trigger a syntax error in non-supporting environments.
var expr = "foo"; var 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"
Specifications
Specification | Status | Comment |
---|---|---|
ECMAScript 5.1 (ECMA-262) Определение 'Object Initializer' в этой спецификации. |
Стандарт | Initial definition. |
ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Method definitions' в этой спецификации. |
Стандарт | Added computed property names. |
ECMAScript 2017 Draft (ECMA-262) Определение 'Method definitions' в этой спецификации. |
Черновик |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | 1 | 2.0 (1.8.1) | 9 | 9.5 | 3 |
Computed property names | Нет | 34 (34) | Нет | Нет | Нет |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (Да) | (Да) | 1.0 (1.8.1) | (Да) | (Да) | (Да) |
Computed property names | Нет | Нет | 34.0 (34.0) | Нет | Нет | Нет |
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 ES6 specification.
See also
- getter
delete
Object.defineProperty()
__defineGetter__
__defineSetter__
- Defining Getters and Setters in JavaScript Guide