【发布时间】:2016-04-26 21:05:26
【问题描述】:
我现在正在研究原型,并认为我快到了,但我对一个主题有点困惑。
假设我们有:
function Animal(name, gender) {
this.name = name;
this.gender = gender;
}
function Cat(species) {
this.species = species;
}
Cat.prototype.color = null;
Cat.prototype = new Animal();
我的问题是,为什么新属性需要prototype?
为什么我们不能这样做:
Cat.color = null;
编辑::
所有的白色块都来自另一个 SO 帖子的 uml 图。我添加了橙色框以适应我提供的这个示例。我添加的这张图还有意义吗?
我认为我的主要问题是我让函数构造函数和实际原型对象过于相似,而实际上它们是完全不同的东西。一个是函数,一个是对象。
编辑 2
通过此图,我试图阐明constructor 属性如何交互以及它与什么确切连接,更具体地说,它如何影响this 的使用。任何关于有效性的 cmets 都会有所帮助。
【问题讨论】:
-
“为什么新属性需要
prototype” 这是一个关于为什么 Brendan Eich 决定以这种方式设计语言的问题(只能回答由他提出),或者这纯粹是一个技术问题(在“Cat和Cat.prototype之间有什么区别”的意义上)? -
顺便说一下,如果你想让
Cat成为Animal的扩展,正确的做法是:Cat.prototype = Object.create(Animal.prototype); Animal.prototype.constructor = Animal; -
@vtange 您刚刚解释的内容与仅使用
Cat.prototype = new Animal(): 相比有什么好处:Cat原型是Animal的一个实例。 (我想我说的没错) -
如果您按照自己的方式进行操作,您的意思是“所有 Cats 都应该与(创建一个没有输入的新 Animal)相同。”这意味着猫与没有名称和性别的动物相同。更多信息请访问stackoverflow.com/questions/16100471/…
-
@vtange 我阅读了 SO 帖子并理解您为什么现在建议这样做,但您为什么要使用
Animal.prototype.constructor = Animal。根据我的阅读,我认为您需要改为对Cat执行此操作:Cat.prototype.constructor = Cat。这样,this上下文将引用Cat构造函数,而不是Animal构造函数。这是正确的吗?
标签: javascript oop properties prototype