在Javascript中,这两种向对象添加函数的方式有什么区别吗?出于任何原因,哪一个更好?向Javascript对象添加函数的不同方法
function ObjA() {
this.AlertA = function() { alert("A"); };
}
ObjA.prototype.AlertB = function() { alert("B"); };
var A = new ObjA();
A.AlertA();
A.AlertB();
在Javascript中,这两种向对象添加函数的方式有什么区别吗?出于任何原因,哪一个更好?向Javascript对象添加函数的不同方法
function ObjA() {
this.AlertA = function() { alert("A"); };
}
ObjA.prototype.AlertB = function() { alert("B"); };
var A = new ObjA();
A.AlertA();
A.AlertB();
确实有区别。如果您定义了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!
使用对象构造函数将为该对象的每个新实例分配一个该函数的副本。使用原型将导致所有实例共享一个功能。
Possbible重复:http://stackoverflow.com/questions/422476/javascript-setting-methods-through-prototype-object-or-in-constructor-differenc –
确实重复,谢谢。 –
[在JavaScript中使用'prototype'与'this'的可能重复吗?](http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript) – user2864740