Object.create()使用

时间:2018-07-03 12:51:50

标签: javascript object inheritance prototype prototypal-inheritance

我只是在学习原型继承,并且对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 :(得分:1)

Object.create是v1.8.5作为alternative way引入的,用于指定对象的原型。上面代码中的实际区别在于,它有点干净,因为在设置原型时不会冗余地调用Mammal构造函数。

您可以使用以下语法在上述模式中获得相同的输出:

Cat.prototype = new Mammal();

但是这里的new关键字将多余地调用构造函数,因为

Mammal.call(this, name);

然后使用设置为Mammal的{​​{1}}再次显式调用this。这样就可以在Cat实例(而不是原型)上设置nameoffspring。根据{{​​3}},这是一种超级构造函数模式。

原型链使Cat可用于所有haveBaby()实例和所有Cat实例。唯一真正的区别是中间Mammal实例与该链中的空对象。