Javascript JS:为什么在继承了另一个原型之后需要重新设置构造函数?

Javascript JS:为什么在继承了另一个原型之后需要重新设置构造函数?,javascript,Javascript,在下面的示例中,为什么需要Dog.prototype.constructor=Dog?我认为我们使用: Dog.prototype=Object.create(Animal.prototype)继承sayamal()和添加到Animal原型的任何其他函数,但这对构造函数有何影响?把它漏掉会怎么样 function Animal(gender) { this.gender = gender; } Animal.prototype.sayAnimal = function() {

在下面的示例中,为什么需要
Dog.prototype.constructor=Dog
?我认为我们使用:
Dog.prototype=Object.create(Animal.prototype)
继承
sayamal()
和添加到
Animal
原型的任何其他函数,但这对构造函数有何影响?把它漏掉会怎么样

function Animal(gender) {
    this.gender = gender;
}

Animal.prototype.sayAnimal = function() {
    return "I am an animal"
}

function Dog(gender, barkSound) {
    Animal.call(this, gender)
    this.barkSound = barkSound
}

Dog.prototype = Object.create(Animal.prototype) 

Dog.prototype.constructor = Dog 
使整个
prototype
对象替换为
Animal.prototype
的新实例,这一点很重要,这样您就不会从原始定义更改的
Animal.prototype
实例开始。此时,如果您要创建一个新的
,则
动物
构造函数将启动,并且在新实例中,您将无法获得
的任何特征,您只需要拥有另一个
动物

但是,当您添加以下内容时:

Dog.prototype.constructor = Dog 
您只需替换
Animal.prototype
的构造器部分,这样,现在当您创建一个新的
Dog
时,您首先要创建一个
Animal
的新实例,但是要使用
Dog
构造器,以便可以增强您的
Animal
并将其作为更具体的类型使用


关于这一点,我已经写了更多。类的用户希望实例的
.constructor
属性引用该实例的构造函数。例如:

类扩展数组扩展数组{
}
常数e=新的扩展数组();

log(e.constructor==ExtendedArray)
如果您正在这样做,我建议您使用
class
。谢谢。起初,我认为创建
Dog
的新实例会产生问题,但由于
Dog
使用
Dog.constructor
,这一点没有改变……使用
Dog.prototype.constructor
?实例的用户,当它不确定它是什么实例时。它可以使用实例的
.constructor
属性来访问构造函数。这种情况在我的经验中是极不寻常的,我从来没有遇到过这样的需要(除了像JS琐碎问题这样愚蠢的事情)
Dog.prototype.constructor = Dog