在走过前端大师的时候,我对下面有点困惑。 有人可以告诉我是否有任何区别? (在创建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。
有人可以帮我核实一下吗?
答案 0 :(得分:1)
那是什么继承最初在javascript中工作的方式(甚至对于类,底层机制仍然是相同的)。
基本上Chordate是Animal的子类。在其他语言中,我们写道:
class Chordate extends Animal {
}
在javascript构造函数中继承自对象。由于Animal()
是构造函数,我们需要将其转换为对象。所以在javascript中我们这样做:
Chordate.prototype = new Animal(); // extend Animal
prototype
属性包含构造函数创建的对象应如何显示的原型或模板。在这种情况下,Chordate
创建的对象应该看起来像Animal
个对象。当您致电new Chordate()
时,原型将被复制到this
中,并将作为新实例返回。
Chordate2
和Chordate3
只是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。