【问题标题】:why we need to create a new object for prototypical inheritance in javascript为什么我们需要在 javascript 中为原型继承创建一个新对象
【发布时间】:2017-03-15 07:12:24
【问题描述】:

我是 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();

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

【问题讨论】:

    标签: javascript node.js inheritance prototypal-inheritance


    【解决方案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);

    【讨论】:

    • 您能否解释一下为什么这是实现继承的最佳方式的区别??
    • @NiteshGoyal 阅读最后一部分
    • @SurenSrapyan:即使这样也有效。 Animal.prototype = new Mammal(); 。我没有清楚地了解所有这些概念。
    • @DeepakKumarPadhy 会起作用的,因为它是一个单独的对象,但是在 JS 中,常用函数都设置在原型中,所以我会在每个对象中保留自定义函数,不要让使用它
    • 而且因为对象也可以有属性及其值,为什么你需要将它们赋予所有 Animal 对象
    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多