[英]Javascript prototypical inheritance, comparing the ways
我遇到了关于如何采访前端javascript开发人员的博客文章 ,并在看到这个问题时感到困惑。
比较这些继承方式。 有什么缺点?
- Button.prototype = new Component();
- Button.prototype = Component.prototype;
- Button.prototype = Object.create(Component.prototype);
这些方法如何彼此不同? 特别是我不知道1到3之间。
为什么你不应该使用第一个:
var Animal = function(){
//instance specific member food
this.food=[];
};
Animal.prototype.eat=function(food){
this.food.push(food);
};
var Cat = function(){};
Cat.prototype = new Animal();
var mimi=new Cat();
var maxi=new Cat();
mimi.eat("fish");
console.log(maxi.food);//=["fish"]
创建Parent的实例以设置Child的原型部分将导致Parent的实例特定成员成为Child的共享原型成员。 在示例代码中,向mimi添加食物会影响maxi的食物成员(因为mimi和maxi都从Cat.prototype.food获得食物成员)。 这可以用Animal.call(this);
解决Animal.call(this);
在Cat构造函数体中(无论如何都应该这样做以重新使用Animal构造函数)但是食物成员仍然存在于Cat的原型中并在创建实例时立即被遮挡。
不使用它的另一个原因是,在创建Animal时,您可能需要在定义Cat及其原型时不可用的数据(作为参数传递)。
为什么不使用第二个:
孩子是父母,但父母不是孩子。 在下一个例子中,猫和狗是动物,但动物不是猫(或狗)。 设置Dog.prototype.bark将设置Animal.prototype.bark,它将让任何Animal的孩子能够吠叫。 Cat实例mimi现在可以吠叫了。
var Animal = function(){};
var Cat = function(){};
Cat.prototype = Animal.prototype;
var Dog = function(){};
Dog.prototype = Animal.prototype;
Dog.prototype.bark=function(){
console.log("woof woof");
};
var mimi=new Cat();
mimi.bark();//=woof woof
所以你应该使用第三个,更多关于构造函数,原型和继承可以在这里找到
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.