Object.create
был введен с v1.8.5 в качестве альтернативного способа для указания прототипа объекта. Реальная разница в приведенном выше коде заключается в том, что он немного чище, потому что конструктор Mammal
не вызывается избыточно при установке прототипа.
Вы можете получить тот же вывод в вышеприведенном шаблоне, используя синтаксис:
Cat.prototype = new Mammal();
Но здесь ключевое слово new
будет вызывать конструктор избыточно, потому что
Mammal.call(this, name);
затем явно вызывает Mammal
снова с this
, установленным на экземпляр Cat
. Так что устанавливает name
и offspring
в экземпляре Cat
(не в прототипе). Это своего рода шаблон супер-конструктора согласно этому классическому примеру наследования .
Цепочка прототипов делает haveBaby()
доступным для всех Cat
экземпляров и всех Mammal
экземпляров. Единственная реальная разница - это промежуточный Mammal
экземпляр против пустого объекта в этой цепочке.