add a section about Object.create(null)
This commit is contained in:
parent
f99c26a5bf
commit
99372573cb
1 changed files with 48 additions and 0 deletions
|
@ -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__
|
## Методы для работы с __proto__
|
||||||
|
|
||||||
|
@ -162,6 +208,8 @@ for (var key in rabbit) {
|
||||||
<dd>Создаёт пустой объект с `__proto__`, равным первому аргументу (кроме IE8-), второй необязательный аргумент может содержать [дескрипторы свойств](/descriptors-getters-setters).</dd>
|
<dd>Создаёт пустой объект с `__proto__`, равным первому аргументу (кроме IE8-), второй необязательный аргумент может содержать [дескрипторы свойств](/descriptors-getters-setters).</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Итого
|
## Итого
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue