我只是在学习原型继承,并且对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()
吗?
答案 0 :(得分:1)
Object.create
是v1.8.5作为alternative way引入的,用于指定对象的原型。上面代码中的实际区别在于,它有点干净,因为在设置原型时不会冗余地调用Mammal
构造函数。
您可以使用以下语法在上述模式中获得相同的输出:
Cat.prototype = new Mammal();
但是这里的new
关键字将多余地调用构造函数,因为
Mammal.call(this, name);
然后使用设置为Mammal
的{{1}}再次显式调用this
。这样就可以在Cat
实例(而不是原型)上设置name
和offspring
。根据{{3}},这是一种超级构造函数模式。
原型链使Cat
可用于所有haveBaby()
实例和所有Cat
实例。唯一真正的区别是中间Mammal
实例与该链中的空对象。