在Javascript中,这两种向对象添加函数的方法有什么区别吗?出于任何原因,一个人更好吗?
function ObjA() {
this.AlertA = function() { alert("A"); };
}
ObjA.prototype.AlertB = function() { alert("B"); };
var A = new ObjA();
A.AlertA();
A.AlertB();
答案 0 :(得分:16)
当然有区别。如果您定义this.AlertA
,则为ObjA
实例定义一个本地方法。如果您将AlertA
添加到ObjA
构造函数的原型中,则会为ObjA
的每个实例定义它。在这种情况下,后者更有效率,因为它只分配了一次,而每次创建ObjA
的实例时都会分配本地方法。
所以在{/ p>中使用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!
答案 1 :(得分:3)
使用对象构造函数会将该函数的副本分配给对象的每个新实例。使用原型设计将导致在所有实例之间共享一个函数。