我正在关注JS继承的视频教程,我坚持下面的最后两行代码:
假设上面有一个Animal
类,我们想要使用属性和方法。
我似乎得到了第二个:Cat.prototype = new Animal()
。它是说为猫的原型分配一个新的动物对象?但我无法理解最后一行代码。
答案 0 :(得分:2)
我建议阅读这篇文章
prototype
属性提供了通过Cat
构造函数创建对象时将继承方法和属性的对象。而constructor
只不过是一个常规属性,通常用于标识用于创建对象的构造函数。
答案 1 :(得分:0)
Cat.prototype = new Animal()
表示Cat
类继承了Animal
类的方法和属性,很可能是因为Cat
是Animal
,并且正在重用Animal
类中Cat
类的方法浪费时间。
Cat.prototype.constructor = Cat
只是使Cat
类的构造函数成为您刚刚为所有Cat
个对象创建的构造函数。
答案 2 :(得分:0)
首先,JavaScript不是基于类的语言。它不知道类的概念,但它知道对象和prototype chain,并且通过这两个组件,我们可以模拟类类行为并实现继承。
但由于这一切都是一种解决方法,我们有时需要付出额外的努力才能使其发挥作用。这就是你的最后一行Cat.prototype.constructor = Cat
进来的地方。
每个函数的prototype
属性都有一个名为constructor
的属性,它指向函数本身。因此,当您将该函数用作构造函数时,内部[[prototype]]
对象也具有constructor
属性。
function Cat() {
}
var cat = new Cat();
console.log(Cat.prototype.constructor); //Cat
console.log(cat.constructor); //Cat
但是,如果应用继承模式,则会覆盖prototype
的完整Cat
属性及其所有属性,包括constructor
属性。
function Cat() {
}
Cat.prototype = new Animal();
var cat = new Cat();
console.log(Cat.prototype.constructor); //Animal
console.log(cat.constructor); //Animal
要解决此问题,我们必须手动设置constructor
属性:
function Cat() {
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
var cat = new Cat();
console.log(Cat.prototype.constructor); //Cat
console.log(cat.constructor); //Cat