在阅读原型时,我遇到了这个示例。

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.prototypeconstructor不正确,原因是:

Rabbit.prototype = new Animal();


这将调用Animal创建一个新实例,并将该实例分配为Rabbit.prototype。因此,其从constructor继承的Animal.prototypeAnimal。您已替换了以前位于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/

10-11 11:29