为什么我们需要在javascript中为原型继承创建一个新对象

时间:2017-03-15 07:12:24

标签: javascript node.js inheritance prototypal-inheritance

我是Node / Javascript世界的新手。我已经浏览了很多关于javascript中继承是如何工作的博客,但我仍然有些困惑。

以下是我设置的示例。



var Mammal = function() {
  this.prop1 = "test1";
}

Mammal.prototype.greet = function(){
  console.log("Hello Word "+ this.prop1);
}


var Animal = function(){
  Mammal.call(this);
  this.prop2 = "test2";
}

Animal.prototype = Mammal.prototype;
//Animal.prototype = Object.create(Mammal.prototype);

var a = new Animal();
a.greet();




我不确定

Animal.prototype = Mammal.prototype;

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

甚至是Animal.prototype = new Mammal();

设置继承的正确方法是什么?两者的工作方式相似。 任何人请帮助我理解两者之间的区别。

1 个答案:

答案 0 :(得分:1)

正确的方法是将Animal的原型设置为另一个对象,该对象是从Mammal创建的,而不是直接设置为该Mammal。设置原型后,还要设置Animal的构造函数。

为什么要使用其他对象?

因为有不同的对象。设置Animal.prototype = Mammal.prototype时,这意味着您引用同一个对象。对于Animal,构造函数将是Mammal函数,这是不正确的。因此,我们创建另一个对象,它接受Mammal prototypes属性和函数,并且该对象现在是不同的。毕竟,我们将该对象的构造函数设置为Animal,因此每个Animal的构造函数都将是Animal函数。

请参阅第一种方法。 Animal和Mammal返回错误的构造函数。

var Mammal = function() {
  this.prop1 = "test1";
}

Mammal.prototype.greet = function(){
  console.log("Hello Word "+ this.prop1);
}


var Animal = function(){
  Mammal.call(this);
  this.prop2 = "test2";
}

Animal.prototype = Mammal.prototype;
Animal.prototype.constructor = Animal;

var a = new Animal();
console.log(a.constructor);

var m = new Mammal();
console.log(m.constructor);

这是正确的方法

var Mammal = function() {
  this.prop1 = "test1";
}

Mammal.prototype.greet = function(){
  console.log("Hello Word "+ this.prop1);
}


var Animal = function(){
  Mammal.call(this);
  this.prop2 = "test2";
}

Animal.prototype = Object.create(Mammal.prototype);
Animal.prototype.constructor = Animal;

var a = new Animal();
console.log(a.constructor);

var m = new Mammal();
console.log(m.constructor);