2013-02-22 62 views
0

从我的理解中,Prototype对象是其他对象继承属性和方法的对象,基本上它拥有一个构造器属性,指向或指向构造函数创建Object.Please考虑下面的代码:结合使用JS的原型和构造器属性

function Animal() 
{ 
this.name="no name"; 
} 

function Cat() 
{ 
    Animal.Call(this);   //Please Explain 
    this.mood="sleepy"; 
} 

Cat.prototype=new Animal();  //Cat inheriting Animal? 
Cat.prototype.constructor=Cat; //Please Explain 

请解释清楚,但在细节的代码行意见和反映的概念,谢谢。

+1

你可能是指'Animal.call(this);'。你究竟想要解释什么?什么'.call'呢?为什么它在那里?或者是什么?顺便说一句,更好的建立原型是'Cat.prototype = Object.create(Animal.prototype);'。在那时你的代码中,你不想创建一个新的'Animal'实例。 – 2013-02-22 13:59:08

+0

是的,我想知道'Animal.call(this)'和'Cat.prototype.constructor = Cat'的用途是什么,'谢谢。 – MrShabana 2013-02-22 14:05:01

回答

1

什么的Animal.call(this)

的目的,就像在其他编程语言调用super()。它调用刚刚创建的新对象(this)上的父构造函数(Animal)。这也在MDN documentation about .call中解释。

在您的示例中,Animal"no name"指定为this.name。因此,在致电Animal.call(this);后,this将具有name财产与上述价值。

Cat.prototype.constructor=Cat;

默认情况下,每个原型的constructor属性指向功能,它属于。但是由于您用Cat.prototype=new Animal();覆盖了原型,现在constructor属性指向一个不同的功能。在这种情况下,由于new Animal返回从Animal.prototype继承的对象,因此Cat.prototype.constructor将指向Animal。为了解决这个问题,我们再次指定Cat

严格地说,这是没有必要的,因为constructor属性没有在任何内部函数中使用。但是,如果您的代码依赖于它,则必须将其设置为正确的值。

+0

谢谢菲利克斯,真的很有帮助 – MrShabana 2013-02-22 14:32:06

+0

不客气! – 2013-02-22 14:36:56