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
Где код, который генерирует строку `"[object Object]"`? Это встроенный метод `toString`, но где он? `obj` ведь пуст!
17
17
18
-
...Но краткая нотация `obj = {}` это тоже самое, что и `obj = new Object()`, где `Object` - встроенная функция-конструктор для объектов с собственным свойством `prototype`, который ссылается на огромный объект с методом `toString` и другими.
18
+
...Но краткая нотация `obj = {}` это то же самое, что и `obj = new Object()`, где `Object` - встроенная функция-конструктор для объектов с собственным свойством `prototype`, который ссылается на огромный объект с методом `toString` и другими.
Стоит обратить внимание, что выше `Object.prototype` по цепочке прототипов нет допольнительного свойства `[[Prototype]]`:
39
+
Стоит обратить внимание, что выше `Object.prototype` по цепочке прототипов нет дополнительного свойства `[[Prototype]]`:
40
40
41
41
```js run
42
42
alert(Object.prototype.__proto__); // null
43
43
```
44
44
45
-
## Other built-in prototypes
45
+
## Другие встроенные прототипы
46
46
47
-
Other built-in objects such as`Array`, `Date`, `Function`and others also keep methods in prototypes.
47
+
Другие встроенные объекты, такие как`Array`, `Date`, `Function`и другие, также хранят свои методы в прототипах.
48
48
49
-
For instance, when we create an array `[1, 2, 3]`, the default `new Array()` constructor is used internally. So the array data is written into the new object, and `Array.prototype` becomes its prototype and provides methods. That's very memory-efficient.
49
+
Например, когда создается массив `[1, 2, 3]`, скрыто используется конструктор по-умолчанию `new Array()`. Так данные массива записываются в новый объект, и прототипом этого объекта становится `Array.prototype`, предоставляя ему свои методы. Это позволяет эффективно использовать память.
50
50
51
-
By specification, all of the built-in prototypes have `Object.prototype` on the top. Sometimes people say that "everything inherits from objects".
51
+
Согласно спецификации, наверху иерархии встроенных прототипов находится `Object.prototype`. Иногда говорят, что "все наследуется от объектов".
52
52
53
-
Here's the overall picture (for 3 built-ins to fit):
53
+
Вот более полная картина (для 3 встроенных объектов):
Some methods in prototypes may overlap, for instance, `Array.prototype`has its own`toString` that lists comma-delimited elements:
72
+
Некоторые методы в прототипах могу пересекаться, например, у `Array.prototype`есть свой метод`toString`, который выводит элементы массива через запятую:
73
73
74
74
```js run
75
75
let arr = [1, 2, 3]
76
-
alert(arr); // 1,2,3 <-- the result of Array.prototype.toString
76
+
alert(arr); // 1,2,3 <-- результат Array.prototype.toString
77
77
```
78
78
79
-
As we've seen before, `Object.prototype`has `toString` as well, but`Array.prototype`is closer in the chain, so the array variant is used.
79
+
Как мы видели раньше, у `Object.prototype`есть свой `toString`, но так как`Array.prototype`ближе в цепочке прототипов, то берётся именно вариант для массивов:
80
80
81
81
82
82

83
83
84
84
85
-
In-browser tools like Chrome developer console also show inheritance (`console.dir`may need to be used for built-in objects):
85
+
В браузерных инструментах, таких как консоль разработчик в Chrome, можно посмотреть цепочку наследования (возможно, потребуется использовать `console.dir`для встроенных объектов):
86
86
87
87

88
88
89
-
Other built-in objects also work the same way. Even functions -- they are objects of a built-in `Function` constructor, and their methods (`call`/`apply`and others) are taken from `Function.prototype`. Functions have their own `toString` too.
89
+
Другие встроенные объекты работают таким же способом. Даже функции -- все они объекты встроенного конструктора `Function`, и все их методы (`call`/`apply`и другие) берутся из `Function.prototype`. Также у функций есть свой метод `toString`.
90
90
91
91
```js run
92
92
functionf() {}
93
93
94
94
alert(f.__proto__==Function.prototype); // true
95
-
alert(f.__proto__.__proto__==Object.prototype); // true, inherit from objects
95
+
alert(f.__proto__.__proto__==Object.prototype); // true, наследует от Object
0 commit comments