子类中的JavaScript设置构造函数?

时间:2016-03-18 20:06:22

标签: javascript inheritance prototypal-inheritance

下面是一个简单的JavaScript继承示例。这条线的目的是什么 从下面?

Dog.prototype.constructor = Dog;

如果我取消评论或注释掉,代码会给我相同的输出。

function Animal(age){
    this.age = age;
    console.log("Animal constructor called")
}
Animal.prototype.walk = function(){
     console.log("Animal with age " + this.age + " walked"); 
}

function Dog(color, age){
    this.color = color;
    Animal.call(this, age)
    console.log("Dog constructor called")
}

Dog.prototype = new Animal();      
//Dog.prototype.constructor = Dog;

dog = new Dog("white", 10);
console.log("Age: " + dog.age +  " Color: " + dog.color );

3 个答案:

答案 0 :(得分:1)

定义函数时,会自动创建prototype属性:

function Animal(age){
    this.age = age;
    console.log("Animal constructor called")
}

Animal.prototype.walk = function(){
     console.log("Animal with age " + this.age + " walked"); 
}

了解构造函数,引用原型对象很简单:Animal.prototype

prototype对象方面,它具有constructor属性来访问原始函数:Animal.prototype.constructor === Animal。这对于从实例确定它的原始类是有用的:

var lion = new Animal();
console.log(lion.constructor === Animal) // prints "true"
console.log(lion.__proto__.constructor === Animal) // prints "true"

如果是继承,则需要手动设置构造函数:

Dog.prototype = new Animal();     
console.log(Dog.prototype.constructor) // prints "function Animal(){}"
Dog.prototype.constructor = Dog;       // setup manually the constructor to Dog
console.log(Dog.prototype.constructor) // prints "function Dog(){}"

为了在以后的课程中正确验证:

var dog = new Dog("white", 10);

console.log(dog.constructor === Animal)           // prints "false"
console.log(dog.__proto__.constructor === Animal) // prints "false"
console.log(dog.constructor === Dog)              // prints "true"
console.log(dog.__proto__.constructor === Dog)    // prints "true"

简而言之,如果要使用构造函数来验证哪个类具有特定实例,则应修复构造函数。

答案 1 :(得分:0)

将原型分配给另一个对象后,原型的构造函数将丢失并需要重新启动(如果以后要引用它)prototype.constructor tutorial

答案 2 :(得分:0)

以下行是DogAnimal继承的原因:

 Dog.prototype = new Animal(); 

但是,到目前为止,Dog的原型是Dog,这意味着构造函数是Dog。通过交换原型,我们现在继承自Animal,但现在的问题是当有人来创建Dog的新实例时,Animal的构造函数将被调用,因为您已换出Dog继承的对象。

因此,我们只需要通过添加:

来更正构造函数部分
 Dog.prototype.constructor = Dog;

现在,我们继承自Dog,但是当创建一个新实例时,将调用Dog中的构造函数,而不是Animal

而且,您会注意到Dog构造函数中有一个对Animal基础对象构造函数的显式调用:

 Animal.call(this, age);

所以,现在你写这个:

 var d = new Dog("white", 10);

调用Dog的构造函数,它调用Animal的构造函数并将10值传递给该构造函数,以便将其用作age的基础属性。但是,正是通过this参数确保新Dogage将绑定到的对象。最后,Animal的实例用作新Dog实例的Prototype对象,因此它继承了Animal的属性。