试图理解JavaScript中的继承——什么';这是怎么回事?

试图理解JavaScript中的继承——什么';这是怎么回事?,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,为什么说“动物”而不是“小猫” 您正在调用Object.create()的方式与我打赌您认为的方式不同。尝试以下更改: Cat.prototype = Object.create(new Animal); Object.create()函数期望它的第一个参数是对象,用作返回对象的原型。当您传入函数名“Animal”时,这意味着您希望原型对象是该函数对象,而不是由该函数构造的对象 编辑-Bergi关于直接使用动物原型的回答可能更有意义,尽管从你发布的内容来看,没有一个动物原型对象上有任何有趣的东

为什么说“动物”而不是“小猫”


您正在调用
Object.create()
的方式与我打赌您认为的方式不同。尝试以下更改:

Cat.prototype = Object.create(new Animal);
Object.create()
函数期望它的第一个参数是对象,用作返回对象的原型。当您传入函数名“Animal”时,这意味着您希望原型对象是该函数对象,而不是由该函数构造的对象

编辑-Bergi关于直接使用动物原型的回答可能更有意义,尽管从你发布的内容来看,没有一个动物原型对象上有任何有趣的东西。这可能在代码的其他地方,或者稍后将添加。无论如何,如果它确实存在,最好按照他的回答去做


由于您的“Cat”构造函数直接从动物构造函数中获取“sayType”属性,因此不清楚您试图通过设置Cat原型来做什么。

您正在调用
对象。create()
的方式与我打赌您认为的方式不同。尝试以下更改:

Cat.prototype = Object.create(new Animal);
Object.create()
函数期望它的第一个参数是对象,用作返回对象的原型。当您传入函数名“Animal”时,这意味着您希望原型对象是该函数对象,而不是由该函数构造的对象

编辑-Bergi关于直接使用动物原型的回答可能更有意义,尽管从你发布的内容来看,没有一个动物原型对象上有任何有趣的东西。这可能在代码的其他地方,或者稍后将添加。无论如何,如果它确实存在,最好按照他的回答去做

由于您的“Cat”构造函数直接从动物构造函数中获取“sayType”属性,因此不清楚通过设置Cat原型您要做什么

是的,但是对于
Animal
constructor函数(或者,确切地说:对于从该函数对象继承的新对象,请选中)。这并不是你想要的——这也解释了你说“动物”的奇怪结果,因为那就是动物

相反,您希望构建一个原型链,以便cat实例继承自
cat.prototype
,后者继承自
Animal.prototype
(后者继承自
Object.prototype
):

此外,对于原型继承,您应该在原型对象上使用
sayName
sayType
方法(并且只使用一次):

是的,但是对于
Animal
constructor函数(或者,确切地说:对于从该函数对象继承的新对象,请选中)。这并不是你想要的——这也解释了你说“动物”的奇怪结果,因为那就是动物

相反,您希望构建一个原型链,以便cat实例继承自
cat.prototype
,后者继承自
Animal.prototype
(后者继承自
Object.prototype
):

此外,对于原型继承,您应该在原型对象上使用
sayName
sayType
方法(并且只使用一次):


@伯吉,嗯?你在这里让我发疯:-)这让小提琴工作起来就像我认为它应该工作一样,但我承认我不确定为什么用“kitty”覆盖“name”不起作用。同样令人困惑的是,考虑到“Cat”构造函数中的
.call()
,设置原型是愚蠢的。我比这里99%的人都更了解JS,但原型继承仍然让我非常困惑:(@Alnitak-lol我知道;我发现除了一些简单的类型之外,我几乎从不使用继承。这会使原型链加倍:-)(很抱歉把你误认为@PointedEars:-)是的,总是从原型继承,而不是从实例继承。@Bergi-huh?你让我发疯了:-)这使得小提琴工作起来就像我认为它应该工作一样,但我承认我不确定为什么用“kitty”覆盖“name”不起作用。同样令人困惑的是,考虑到“Cat”构造函数中的
.call()
,设置原型是愚蠢的。我比这里99%的人都更了解JS,但原型继承仍然让我非常困惑:(@Alnitak-lol我知道;我发现除了一些简单的类型之外,我几乎从不使用继承。这使原型链加倍:-)(很抱歉将您误认为@PointedEars:-)是的,始终从原型继承,而不是从实例继承。您的
sayType
sayName
函数实际上没有使用原型继承,因为它们不在原型上!您已将它们创建为实例本地属性。您的
sayType
sayName
函数实际上没有使用原型cal继承,因为它们不在原型上!您已经将它们创建为实例本地属性。好吧,我承认这可能是他想要做的;因为根本没有提到动物原型,所以我没有想到这一点。但是这是一种可能性。感谢您的回复。当我这样做时,我得到了未捕获的类型错误:Object#Nevermind,我在我添加了sayName函数之后覆盖了Cat的原型,修复了:好吧,我承认这可能是他想要做的;因为根本没有提到动物原型,所以我没有想到这一点。但是这是一种可能性。感谢您的回复。当我这样做时,我得到了未捕获的TypeError:Object#Nevermind,我覆盖了Cat的prototype在我添加sayName函数后,修复了:
Object.create(Animal); // set Cat's prototype to Animal
Cat.prototype = Object.create(Animal.prototype);
Animal.prototype.sayType = function() {
    alert(this.type);
};
Cat.prototype.sayName = function() { // after creation of that object, of course
    alert(this.name);
};