Skip to content

Commit 9937257

Browse files
committed
add a section about Object.create(null)
1 parent f99c26a commit 9937257

1 file changed

Lines changed: 48 additions & 0 deletions

File tree

1-js/9-prototypes/1-prototype/article.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,52 @@ for (var key in rabbit) {
145145
}
146146
```
147147

148+
## Object.create(null)
149+
150+
Зачастую объекты используют для хранения произвольных значений по ключу, как коллекцию:
151+
152+
```js
153+
var data = {};
154+
data.text = "Привет";
155+
data.age = 35;
156+
// ...
157+
```
158+
159+
При дальнейшем поиске в этой коллекции мы найдём не только `text` и `age`, но и встроенные функции:
160+
161+
```js
162+
//+ run
163+
var data = {};
164+
alert(data.toString); // функция, хотя мы её туда не записывали
165+
```
166+
167+
Это может быть неприятным сюрпризом и приводить к ошибкам, если названия свойств приходят от посетителя и могут быть произвольными.
168+
169+
Чтобы этого избежать, мы можем исключать свойства, не принадлежащие самому объекту:
170+
```js
171+
//+ run
172+
var data = {};
173+
174+
// выведет toString только если оно записано в сам объект
175+
alert(data.hasOwnProperty('toString') ? data.toString : undefined);
176+
```
177+
178+
Однако, есть путь и проще:
179+
```js
180+
//+ run
181+
*!*
182+
var data = Object.create(null);
183+
*/!*
184+
data.text = "Привет";
185+
186+
alert(data.text); // Привет
187+
*!*
188+
alert(data.toString); // undefined
189+
*/!*
190+
```
191+
192+
Объект, создаваемый при помощи `Object.create(null)` не имеет прототипа, а значит в нём нет лишних свойств. Для коллекции -- как раз то, что надо.
193+
148194

149195
## Методы для работы с __proto__
150196

@@ -162,6 +208,8 @@ for (var key in rabbit) {
162208
<dd>Создаёт пустой объект с `__proto__`, равным первому аргументу (кроме IE8-), второй необязательный аргумент может содержать [дескрипторы свойств](/descriptors-getters-setters).</dd>
163209
</dl>
164210

211+
212+
165213
## Итого
166214

167215

0 commit comments

Comments
 (0)