繁体   English   中英

Javascript原型继承,比较方式

[英]Javascript prototypical inheritance, comparing the ways

我遇到了关于如何采访前端javascript开发人员的博客文章 ,并在看到这个问题时感到困惑。

比较这些继承方式。 有什么缺点?

  1. Button.prototype = new Component();
  2. Button.prototype = Component.prototype;
  3. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM