add a section about Object.create(null)

This commit is contained in:
Ilya Kantor 2015-06-17 15:00:52 +03:00
parent f99c26a5bf
commit 99372573cb

View file

@ -145,6 +145,52 @@ for (var key in rabbit) {
}
```
## Object.create(null)
Зачастую объекты используют для хранения произвольных значений по ключу, как коллекцию:
```js
var data = {};
data.text = "Привет";
data.age = 35;
// ...
```
При дальнейшем поиске в этой коллекции мы найдём не только `text` и `age`, но и встроенные функции:
```js
//+ run
var data = {};
alert(data.toString); // функция, хотя мы её туда не записывали
```
Это может быть неприятным сюрпризом и приводить к ошибкам, если названия свойств приходят от посетителя и могут быть произвольными.
Чтобы этого избежать, мы можем исключать свойства, не принадлежащие самому объекту:
```js
//+ run
var data = {};
// выведет toString только если оно записано в сам объект
alert(data.hasOwnProperty('toString') ? data.toString : undefined);
```
Однако, есть путь и проще:
```js
//+ run
*!*
var data = Object.create(null);
*/!*
data.text = "Привет";
alert(data.text); // Привет
*!*
alert(data.toString); // undefined
*/!*
```
Объект, создаваемый при помощи `Object.create(null)` не имеет прототипа, а значит в нём нет лишних свойств. Для коллекции -- как раз то, что надо.
## Методы для работы с __proto__
@ -162,6 +208,8 @@ for (var key in rabbit) {
<dd>Создаёт пустой объект с `__proto__`, равным первому аргументу (кроме IE8-), второй необязательный аргумент может содержать [дескрипторы свойств](/descriptors-getters-setters).</dd>
</dl>
## Итого