Object.create()
Стандарт ECMAScript 5 определяет метод Object.create()
, который создает новый объект и использует свой первый аргумент в качестве прототипа этого объекта. Дополнительно Object.create()
может принимать второй необязательный аргумент, описывающий свойства нового объекта.
Этот метод очень удобен, так как позволяет вам указывать объект прототип для нового вашего объекта без определения функции конструктора.
Object.create()
является статической функцией, а не методом, вызываемым относительно некоторого конкретного объекта. Чтобы вызвать эту функцию, достаточно передать ей желаемый объект-прототип:
var o1 = Object.create({x:1, y:2}); // o1 наследует свойства x и y
Чтобы создать объект, не имеющий прототипа, можно передать значение null
, но в этом случае вновь созданный объект не унаследует ни каких-либо свойств, ни базовых методов, таких как toString()
(а это означает, что этот объект нельзя будет использовать в выражениях с оператором +
):
var o2 = Object.create(null); // o2 не наследует ни свойств, ни методов
Если в программе потребуется создать обычный пустой объект (который, например, возвращается литералом {}
или выражением new Object()
), передайте в первом аргументе Object.prototype:
var o3 = Object.create(Object.prototype); // o3 подобен объекту, созданному
// с помощью {} или new Object().
Эмуляция Object.create для IE8-
ВызовObject.create(proto)
, который создаёт пустой объект с данным прототипом, можно эмулировать, так что он будет работать во всех браузерах, включая IE6+.
Кросс-браузерный аналог —inherit
состоит буквально из нескольких строк:
function inherit(proto) {
function F() {}
F.prototype = proto;
var object = new F;
return object;
}
- Создана новая функция
F
. Она ничего не делает сthis
, так что вызовnew F
вернёт пустой объект. - Свойство
F.prototype
устанавливается в будущий прототипproto
; Результатом вызова
new F
будет пустой объект с__proto__
равным значениюF.prototype
.Готово! Мы получили пустой объект с заданным прототипом.
Результат вызоваinherit(animal)
идентиченObject.create(animal)
. Это будет новый пустой объект с прототипомanimal
.
var animal = { eats: true };
var rabbit = inherit(animal);
console.log(rabbit.eats); // true