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