Использование Object.create () - PullRequest
0 голосов
/ 03 июля 2018

Я только что узнал о наследовании прототипов и немного запутался в использовании Object.create (). Я запутался, почему Object.create () нужен в следующем коде:

function Mammal (name){
  this.name = name;
  this.offspring = [];
}

Mammal.prototype.haveBaby = function (){
  var baby = new Mammal('Baby ' + this.name);
  this.offspring.push(baby);
  return baby;
}

function Cat (name, color){
  Mammal.call(this, name);
  this.color = color;
}

Cat.prototype = Object.create(Mammal.prototype);

Разве function Cat(name, color){ Mammal.call(this, name) } не передает методы от Млекопитающего? Вот почему нам нужно Object.create()?

1 Ответ

0 голосов
/ 03 июля 2018

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 экземпляр против пустого объекта в этой цепочке.

...