aboutsummaryrefslogtreecommitdiff
path: root/files/ru/web/javascript/reference/functions/set/index.html
blob: 75211011aa744748c6e49c62e6e58d331972d1ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
---
title: setter
slug: Web/JavaScript/Reference/Functions/set
translation_of: Web/JavaScript/Reference/Functions/set
---
<div>{{jsSidebar("Functions")}}</div>

<p>Оператор <strong><code>set</code></strong> связывает свойство объекта с функцией, которая будет вызвана при попытке установить это свойство.</p>

<h2 id="Синтаксис">Синтаксис</h2>

<pre class="syntaxbox">{set <em>prop</em>(<em>val</em>) { . . . }}
{set [expression](<em>val</em>) { . . . }}</pre>

<h3 id="Параметры">Параметры</h3>

<dl>
 <dt><code>prop</code></dt>
 <dd>Имя свойства для привязки к заданной функции.</dd>
</dl>

<dl>
 <dt><code>val</code></dt>
 <dd>Псевдоним переменной, которая хранит значение, неудавшегося определения <code>prop.</code></dd>
 <dt>expression</dt>
 <dd>Начиная с ECMAScript 6, вы также можете использовать выражения для вычисляемого имя свойства для привязки к данной функции.</dd>
</dl>

<h2 id="Описание">Описание</h2>

<p>В JavaScript, сеттер можно использовать для выполнения функции, когда будет попытка изменения указанного свойства. Сеттеры используются чаще всего в сочетании с геттерами для создания одного из видов псевдо-свойства. Невозможно одновременно иметь сеттер для свойства, которое содержит фактическое значение.</p>

<p>Обратите внимание на следующие моменты при работе с синтаксисом <code>set</code>:</p>

<div>
<ul>
 <li>Он может иметь идентификатор, который является либо числом, либо строкой;</li>
 <li>Он должен иметь ровно один параметр (смотрите <a class="external" href="http://whereswalden.com/2010/08/22/incompatible-es5-change-literal-getter-and-setter-functions-must-now-have-exactly-zero-or-one-arguments/" rel="external nofollow">Incompatible <abbr title="ECMAScript 5th edition">ES5</abbr> change: literal getter and setter functions must now have exactly zero or one arguments</a> для более подробной информации);</li>
 <li>Он не должен объявляться в литерале объекта, с другим набором или вводом данных для того же самого свойства.<br>
  ( <code>{ set x(v) { }, set x(v) { } }</code> и <code>{ x: ..., set x(v) { } }</code> запрещены)</li>
</ul>
</div>

<p>Сеттер может быть удалён оператором <a href="/en-US/docs/Web/JavaScript/Reference/Operators/delete" title="en-US/docs/JavaScript/Reference/Operators/Special/delete"><code>delete</code></a>.</p>

<h2 id="Примеры">Примеры</h2>

<h3 id="Определение_сеттера_при_инициализации_новых_объектов">Определение сеттера при инициализации новых объектов</h3>

<p>Это позволит определить псевдо-параметр <code>current</code> объекта <code>o</code>, который задаёт значение, обновляющее значение <code>log</code>:</p>

<pre class="brush: js">var o = {
  set current (str) {
    this.log[this.log.length] = str;
  },
  log: []
}
</pre>

<p><code>обратите внимание, что current</code> не определён и любые попытки доступа к нему вернут <code>undefined</code>.</p>

<h3 id="Удаление_сеттера_оператором_delete">Удаление сеттера оператором <code>delete</code></h3>

<p>Если вы хотите удалить сеттер, вы можете просто его <code><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete">удалить</a></code>:</p>

<pre class="brush: js">delete o.current;
</pre>

<h3 id="Определение_сеттера_для_существующих_объектов_используя_defineProperty">Определение сеттера для существующих объектов используя <code>defineProperty</code></h3>

<p>Чтобы добавить сеттер на существующий объект в любое время, используйте {{jsxref("Object.defineProperty()")}}.</p>

<pre class="brush: js">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</pre>

<h3 id="Использование_вычисляемого_имени_свойства">Использование вычисляемого имени свойства </h3>

<pre class="brush: js">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"
</pre>

<h2 id="Спецификации">Спецификации</h2>

{{Specifications}}

<p><font face="x-locale-heading-primary, zillaslab, Palatino, Palatino Linotype, x-locale-heading-secondary, serif"><span style="font-size: 40px;"><strong>Совместимость с браузерами</strong></span></font></p>

<p>{{Compat("javascript.functions.set")}}</p>

<h2 id="Смотрите_также">Смотрите также</h2>

<ul>
 <li><a href="/en-US/docs/Web/JavaScript/Reference/Functions/get">getter</a></li>
 <li>{{jsxref("Operators/delete", "delete")}}</li>
 <li>{{jsxref("Object.defineProperty()")}}</li>
 <li>{{jsxref("Object.defineGetter", "__defineGetter__")}}</li>
 <li>{{jsxref("Object.defineSetter", "__defineSetter__")}}</li>
 <li><a href="/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Defining_getters_and_setters">Defining Getters and Setters</a> в руководстве по JavaScript</li>
</ul>