原型的目的是什么?

可能重复:
了解JavaScript中的原型inheritance

好的,所以我对JS中OOP的想法有点新鲜。

这两个代码片段之间有什么区别:

function animal(){ this.name = 'rover'; this.set_name = function(name){ this.name = name; } } 
 function animal(){ this.name = 'rover'; } animal.prototype.set_name = function(name){ this.name = name; } 

他们都做同样的事情,有什么区别?

使用原型可以更快地创build对象,因为每次创build新对象时都不必重新创build该函数。

当你这样做:

 function animal(){ this.name = 'rover'; this.set_name = function(name){ this.name = name; } } 

每次创build动物时,都会重新创buildset_name函数。 但是,当你这样做

 animal.prototype.set_name = function(name){ this.name = name; } 

该function不必每次重新创build; 它存在于原型中的一个地方。 所以当你调用someAnimal.set_name("Ubu"); this上下文将被设置为someAnimal并且(唯一的) set_name函数将被调用。


使用第一种语法有一个好处:以这种方式创build的函数可以访问私有数据:

 function animal(){ var privateData = 'foo' this.name = 'rover'; this.set_name = function(name){ this.name = name; alert(privateData); //will alert 'foo' } } 

道格拉斯·克罗克福德(Douglas Crockford)把这样的function称为“有特权的”:出于这个原因,他们可以访问公共和私人数据。

从这些函数中创build新的对象时会出现差异

 var animal1 = new animal(); 

由第一个函数创build的所有对象将具有不同的nameset_name属性。 但是,由第二个函数创build的所有对象将共享set_name属性。

在第一个例子中,每个单独的动物对于set_name函数都有自己的属性,而在第二个示例中,它们通过它们的原型共享相同的函数。

第一个版本的优点是方法可以访问在构造函数中声明的本地(私有)variables。

第二种方法的好处是它只需要更less的内存(因为你只存储了一次而不是一百万次),而且在当前的JS引擎中更具性能。

使用第二种方法,您还可以修改或向方法中添加方法,这样也会影响已创build的实例。