2014-01-05 218 views
0

我下面就JS继承的视频教程,我被困在最后2行的代码如下:JavaScript继承。从另一个类继承的对象和方法

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

上述假设有一个Animal类,我们希望使用属性和方法。

我似乎获得倒数第二:Cat.prototype = new Animal()。它是否认为给猫的原型分配一个新的动物物体?但我无法理解最后一行代码。

回答

2

我会推荐阅读这篇文章

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

+0

我明白了!你不能做新的猫(),因为如果我们这样做,我们错过了动物的所有属性和方法。对? – user3162361

+0

如果您阅读参考文章,您会发现构造函数属性不会执行任何功能,您可以使用它进行操作! – ColinE

0

Cat.prototype = new Animal()Cat类继承该方法和Animal类,最可能的性能,因为CatAnimal,和再利用从AnimalCat类浪费时间的方法。

Cat.prototype.constructor = Cat只是使Cat类的构造函数成为上面为所有Cat对象所做的构造函数。

+1

这完全错了。不要谈论非班级语言的班级和超班。 – farvilain

+0

看看这个:http://www.codecademy.com/courses/objects-ii/3/3?curriculum_id=506324b3a7dffd00020bf661 –

+1

看看这个:http://www.ecma-international.org/publications/files/ECMA -ST/Ecma-262.pdf 4.2.1:[ECMAScript不使用C++,Smalltalk或Java中的类],即使青少年在公共wiki上写了相反的内容。 – farvilain

0

首先,JavaScript不是基于类的语言。它不知道类的概念,但它知道对象和这两个组件,我们可以模拟类的行为并实现继承。

但是,由于这一切都是一种解决方法,我们有时必须付出额外的努力才能使其发挥作用。并且这是您最后一行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 

但是,如果你申请你的遗传模式,重写的Cat完整prototype财产及其所有属性,包括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