2011-08-18 59 views
12

在Javascript中,这两种向对象添加函数的方式有什么区别吗?出于任何原因,哪一个更好?向Javascript对象添加函数的不同方法

function ObjA() { 
    this.AlertA = function() { alert("A"); }; 
} 
ObjA.prototype.AlertB = function() { alert("B"); }; 

var A = new ObjA(); 
A.AlertA(); 
A.AlertB(); 
+0

Possbible重复:http://stackoverflow.com/questions/422476/javascript-setting-methods-through-prototype-object-or-in-constructor-differenc –

+0

确实重复,谢谢。 –

+0

[在JavaScript中使用'prototype'与'this'的可能重复吗?](http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript) – user2864740

回答

16

确实有区别。如果您定义了this.AlertA,那么您正在为ObjA的实例定义一个本地方法。如果您将AlertA添加到ObjA构造函数的原型,则会为ObjA的每个实例定义它。后者在这种情况下效率更高,因为它只分配一次,而每次创建ObjA的实例时会分配一个本地方法。

因此,使用在this.AlertA

var A = new ObjA, 
    B = new ObjA, 
    C = new ObjA; 

为A,B和C的构造已添加的方法AlertA。另一方面,AlertB只添加一次。您可以使用以下方法检查:

function ObjA() { 
     alert('adding AlertA!'); 
     this.AlertA = function() { 
      alert("A"); 
     }; 

     if (!ObjA.prototype.AlertB) { 
      alert('adding AlertB!'); 
      ObjA.prototype.AlertB = function() { 
       alert("B"); 
      }; 
     } 
} 

var A = new ObjA, //=> alerts adding AlertA! and alerts adding AlertB! 
    B = new ObjA, //=> alerts adding AlertA! 
    C = new ObjA; //=> alerts adding AlertA! 
3

使用对象构造函数将为该对象的每个新实例分配一个该函数的副本。使用原型将导致所有实例共享一个功能。