向Javascript对象添加函数的不同方法

时间:2011-08-18 15:25:25

标签: javascript

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

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

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

2 个答案:

答案 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)

使用对象构造函数会将该函数的副本分配给对象的每个新实例。使用原型设计将导致在所有实例之间共享一个函数。