javascript原型和新对象混淆

时间:2016-09-05 02:47:40

标签: javascript

在走过前端大师的时候,我对下面有点困惑。 有人可以告诉我是否有任何区别? (在创建Object Chordate和Chordate2和Chordate3?)。他们在根本上有所不同吗?

我认为总是在做newObject = new构造函数是在javascript中构建新对象的方法,但是这个newObject.prototype = new构造函数让我失望了。

  Animal = function(name){this.name = name};
  Animal.prototype.eats = function(){
          return this.name + " is eating"
  }

  Chordate = function(name){this.name = name;}
  Chordate.prototype = new Animal();

  Chordate2 = function(name){this.name = name;}
  Chordate2 = new Animal();

  Chordate3 = new Animal();

- 我自己的回答 -

  

我可能需要观看更多视频(因为我认为他们会说这不是推荐的,但我现在明白这是如何运作的。这是我的困惑和澄清。

创建的每个函数(它是另一个对象)都指向它自己的原型(基本上是对象) Chordate已经是一个对象并拥有它自己的原型指向它自己的对象(原型),这一行(Chordate.prototype = new Animal();)正在改变.prototype指向Animal原型。 (看起来很黑,我需要阅读并观看更多内容)。

所以,基于Chordate2的原型也是它自己的原型,当你在它上面运行新动物时,它只会删除它,并且只存在Animal.prototype。

相同的w /(除了Chordate3.prototype从未存在)Chordate3。

有人可以帮我核实一下吗?

3 个答案:

答案 0 :(得分:1)

那是什么继承最初在javascript中工作的方式(甚至对于类,底层机制仍然是相同的)。

基本上Chordate是Animal的子类。在其他语言中,我们写道:

class Chordate extends Animal {

}

在javascript构造函数中继承自对象。由于Animal()是构造函数,我们需要将其转换为对象。所以在javascript中我们这样做:

Chordate.prototype = new Animal(); // extend Animal

prototype属性包含构造函数创建的对象应如何显示的原型或模板。在这种情况下,Chordate创建的对象应该看起来像Animal个对象。当您致电new Chordate()时,原型将被复制到this中,并将作为新实例返回。

Chordate2Chordate3只是Animal的实例。从代码和对象的命名,他们看起来像一个不熟悉javascript的人混淆代码。我个人期望chordate2 = new Chordate()

答案 1 :(得分:0)

第一个Chordate赋值" Chordate = function(name){this.name = name;}分配一个与Animal相同的构造函数,然后下一行将Animal()构造函数添加到Chordate对象

然后Chordate2以构造函数赋值开始,然后被覆盖为具有未定义name属性的Animal对象,因为没有参数传递给构造函数。

最后,Chordate3只是一个具有未初始化名称属性的Animal对象。

答案 2 :(得分:0)

我对回答我自己的问题并把它作为一个答案感到很有趣但是正如@torazaburo所建议的那样,让评论家作为实际提供答案的人是有好处的(直到现在,我只问过)即使这是错的,所以在这里:

部分原因是以下实际上是什么

Object.prototype

我完全理解当创建函数(Animal)时,它指向它自己的原型(它反过来指向基础对象(它自己的原型)(这可以通过 proto 找到)链)。

  

创建Chordate函数时,它指向它自己的函数   原型。但是,当Chordate.prototype = new Animal运行时,它   基本上覆盖了它自己的原型并指向Animal's   原型。无论是否不推荐,我都渴望找到   为什么。我想我更专注于学习这个   Object.prototype的工作原理以及与otherObject的关系(in   这个案例动物)正在创建。

When Chordate2 is ran,
   1)it creates a function and have it point to it’s own prototype
   2)when you run new Animal() = Chordate2, it essentially erases Chordate2 and creates a brand new object and
     only prototype remains is Animal.prototype. Chordate2’s relationship to that is found through __proto__

相同的概念w /(Chordate3.prototype从未存在)Chordate3。