在阅读原型时,我遇到了这个示例。
function Animal(){
this.name = 'Animal'
}
var animal1 = new Animal();
function Rabbit(){
this.canEat = true;
}
Rabbit.prototype = new Animal();
var r = new Rabbit();
console.log(r.constructor)
控制台为我提供了Animal作为r.constructor的输出,这有点令人困惑,因为当r是通过使用new运算符调用Rabbit创建的时,构造函数属性应该返回Rabbit。
另外,如果我在分配原型之前调用Rabbit函数,它将给我所需的结果。
最佳答案
对象从其原型继承constructor
(通常);它们是从构造函数的prototype
属性获取原型的,该构造函数在创建它们时创建(如果它们是由构造函数创建的)。 Rabbit.prototype
的constructor
不正确,原因是:
Rabbit.prototype = new Animal();
这将调用
Animal
创建一个新实例,并将该实例分配为Rabbit.prototype
。因此,其从constructor
继承的Animal.prototype
是Animal
。您已替换了以前位于Rabbit.prototype
上的默认对象(该对象已将constructor
设置为Rabbit
)。通常,
Rabbit.prototype = new Animal()
并不是建立继承的最佳方法。相反,您可以这样做:Rabbit.prototype = Object.create(Animal.prototype);
Rabbit.prototype.constructor = Rabbit;
然后在
Rabbit
中:function Rabbit() {
Animal.call(this); // ***
this.name = "Rabbit"; // Presumably we want to change Animal's deafult
this.canEat = true;
}
那里的三个变化:
设置继承时,我们不调用
Animal
,我们只是创建一个使用Animal.prototype
作为其原型的新对象,并将其放在Rabbit.prototype
上。我们在分配给
constructor
的新对象上设置Rabbit.prototype
。初始化实例时(在
Animal
中),我们确实调用了Rabbit
。现场示例:
function Animal(){
this.name = 'Animal'
}
var animal1 = new Animal();
function Rabbit() {
Animal.call(this); // ***
this.name = "Rabbit"; // Presumably we want to change Animal's deafult
this.canEat = true;
}
Rabbit.prototype = Object.create(Animal.prototype);
Rabbit.prototype.constructor = Rabbit;
var r = new Rabbit();
console.log(r.constructor);
或者,当然,请使用ES2015 +
class
语法,该语法可以为您处理这些问题(以及其他一些好处)。class Animal {
constructor() {
this.name = "Animal";
}
}
class Rabbit extends Animal {
constructor() {
super();
this.name = "Rabbit";
this.canEat = true;
}
}
const r = new Rabbit();
console.log(r.constructor);
关于javascript - 对象的构造方法属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48057386/