下面是一个简单的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 );
答案 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)
以下行是Dog
从Animal
继承的原因:
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
参数确保新Dog
是age
将绑定到的对象。最后,Animal
的实例用作新Dog
实例的Prototype对象,因此它继承了Animal
的属性。