You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
...А также "узаконено" свойство `__proto__`, которое даёт прямой доступ к прототипу. Его, в качестве "нестандартного", но удобного способа работы с прототипом реализовали почти все браузеры (кроме IE10-), так что было принято решение добавить его в стандарт.
85
85
86
-
По стандарту оно реализовано через геттеры-сеттеры `Object.getPrototypeOf/setPrototypeOf`.
87
-
88
-
89
86
## Object.assign
90
87
88
+
Функция `Object.assign` получает список объектов и копирует в первый `target` свойства из остальных.
89
+
91
90
Синтаксис:
92
91
```js
93
92
Object.assign(target, src1, src2...)
94
93
```
95
94
96
-
Функция `Object.assign` получает список объектов и копирует в первый `target` свойства из остальных.
97
-
98
-
Последующие свойства перезаписывают предыдущие.
95
+
При этом последующие свойства перезаписывают предыдущие.
При сравнении объектов через `Object.is` успользуется алгоритм [SameValue](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-samevalue), который неявно применяется во многих других местах современного стандарта.
147
+
Отличия эти в большинстве ситуаций некритичны, так что непохоже, чтобы эта функция вытеснила обычную проверку `===`. Что интересно -- этот алгоритм сравнения, который называется [SameValue](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-samevalue), применяется во внутренних реализациях различных методов современного стандарта.
134
148
135
149
136
150
## Методы объекта
137
151
138
152
Долгое время в JavaScript термин "метод объекта" был просто альтернативным названием для свойства-функции.
139
153
140
-
Теперь это уже не так, добавлены именно "методы объекта". Они, по сути, являются "свойствами-функциями, привязанными к объекту".
154
+
Теперь это уже не так, добавлены именно "методы объекта", которые, по сути, являются свойствами-функциями, привязанными к объекту.
141
155
142
156
Их особенности:
143
157
144
158
<ol>
145
-
<li>Более короткий синтаксис.</li>
146
-
<li>Наличие в методах специального внутреннего свойства `[[HomeObject]]` ("домашний объект"), ссылающегося на объект, которому метод принадлежит. Мы посмотрим его использование чуть дальше, в разделе про `super`.</li>
159
+
<li>Более короткий синтаксис объявления.</li>
160
+
<li>Наличие в методах специального внутреннего свойства `[[HomeObject]]` ("домашний объект"), ссылающегося на объект, которому метод принадлежит. Мы посмотрим его использование чуть дальше.</li>
147
161
</ol>
148
162
149
163
Для объявления метода вместо записи `"prop: function() {…}"` нужно написать просто `"prop() { … }"`.
@@ -158,7 +172,7 @@ let name = "Вася";
158
172
let user = {
159
173
name,
160
174
*!*
161
-
/* вместо sayHi: function() {*/
175
+
// вместо "sayHi: function() {" пишем "sayHi() {"
162
176
sayHi() {
163
177
alert(this.name);
164
178
}
@@ -168,7 +182,7 @@ let user = {
168
182
user.sayHi(); // Вася
169
183
```
170
184
171
-
Как видно, создание такого метода -- чуть короче, а обращение -- не отличается от обычной функции.
185
+
Как видно, для создания метода нужно писать меньше букв. Что же касается вызова -- он ничем не отличается от обычной функции. На данном этапе можно считать, что "метод" -- это просто сокращённый синтаксис для свойства-функции. Дополнительные возможности, которые даёт такое объявление, мы рассмотрим позже.
172
186
173
187
Также методами станут объявления геттеров `get prop()` и сеттеров `set prop()`:
174
188
@@ -207,11 +221,17 @@ let user = {
207
221
alert( user.getFirstName() ); // Вася
208
222
```
209
223
224
+
Итак, мы рассмотрели синтаксические улучшения. Если коротко, то не надо писать слово "function". Теперь перейдём к другим отличиям.
225
+
210
226
## super
211
227
228
+
В ES-2015 появилось новое ключевое слово `super`. Оно предназначено только для использования в методах объекта.
229
+
212
230
Вызов `super.parentProperty` позволяет из метода объекта получить свойство его прототипа.
213
231
214
-
Например, в коде ниже `rabbit` наследует от `animal`. Вызов `super.walk` из метода объекта `rabbit` обращается к `animal.walk`:
232
+
Например, в коде ниже `rabbit` наследует от `animal`.
233
+
234
+
Вызов `super.walk()` из метода объекта `rabbit` обращается к `animal.walk()`:
215
235
216
236
```js
217
237
//+ run
@@ -236,9 +256,11 @@ let rabbit = {
236
256
rabbit.walk();
237
257
```
238
258
259
+
Как правило, это используется в [классах](/class), которые мы рассмотрим в следующем разделе, но важно понимать, что "классы" здесь на самом деле не при чём. Свойство `super` работает через прототип, на уровне методов объекта.
260
+
239
261
При обращении через `super` используется `[[HomeObject]]` текущего метода, и от него берётся `__proto__`. Поэтому `super` работает только внутри методов.
240
262
241
-
Например, если переписать этот код, оформив `rabbit.walk` как обычное свойство-функцию, то будет ошибка:
263
+
В частности, если переписать этот код, оформив `rabbit.walk` как обычное свойство-функцию, то будет ошибка:
242
264
243
265
```js
244
266
//+ run
@@ -253,7 +275,7 @@ let animal = {
253
275
let rabbit = {
254
276
__proto__: animal,
255
277
*!*
256
-
walk:function() {
278
+
walk:function() {// Надо: walk() {
257
279
super.walk(); // Будет ошибка!
258
280
}
259
281
*/!*
@@ -289,9 +311,11 @@ let rabbit = {
289
311
rabbit.walk();
290
312
```
291
313
314
+
Ранее мы говорили о том, что у функций-стрелок нет своего `this`, `arguments`: они используют те, которые во внешней функции. Теперь к этому списку добавился ещё и `super`.
315
+
292
316
[smart header="Свойство `[[HomeObject]]` -- не изменяемое"]
293
317
294
-
При создании метода -- он привязан к своему объекту навсегда. Технически можно даже скопировать его и запустить независимо:
318
+
При создании метода -- он привязан к своему объекту навсегда. Технически можно даже скопировать его и запустить отдельно, и `super` продолжит работать:
295
319
296
320
```js
297
321
//+ run
@@ -310,14 +334,14 @@ let rabbit = {
310
334
311
335
let walk =rabbit.walk; // скопируем метод в переменную
312
336
*!*
313
-
walk();
337
+
walk(); // вызовет animal.walk()
314
338
// I'm walking
315
339
*/!*
316
340
```
317
341
318
342
В примере выше метод `walk()` запускается отдельно от объекта, но всё равно сохраняется через `super` доступ к его прототипу, благодаря `[[HomeObject]]`.
319
343
320
-
Это относится именно к `super`. Правила `this`для методов те же, что и для обычных функций. В примере выше при вызове `walk()` без объекта `this` будет `undefined`.
344
+
Это -- скорее технический момент, так как методы объекта, всё же, предназначены для вызова в контексте этого объекта. В частности, правила для `this`в методах -- те же, что и для обычных функций. В примере выше при вызове `walk()` без объекта `this` будет `undefined`.
0 commit comments