javascript继承。从另一个类继承对象和方法

时间:2014-01-05 11:48:19

标签: javascript inheritance

我正在关注JS继承的视频教程,我坚持下面的最后两行代码:

http://i.imgur.com/A9DDMHL.jpg

假设上面有一个Animal类,我们想要使用属性和方法。

我似乎得到了第二个:Cat.prototype = new Animal()。它是说为猫的原型分配一个新的动物对象?但我无法理解最后一行代码。

3 个答案:

答案 0 :(得分:2)

我建议阅读这篇文章

prototype属性提供了通过Cat构造函数创建对象时将继承方法和属性的对象。而constructor只不过是一个常规属性,通常用于标识用于创建对象的构造函数。

答案 1 :(得分:0)

Cat.prototype = new Animal()表示Cat类继承了Animal类的方法和属性,很可能是因为CatAnimal,并且正在重用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