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

Ada*_*kis 12 javascript

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

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

var A = new ObjA();
A.AlertA();
A.AlertB();
Run Code Online (Sandbox Code Playgroud)

Koo*_*Inc 16

当然有区别.如果定义this.AlertA,则为实例定义一个本地方法ObjA.如果添加AlertAObjA 构造函数的原型,则为每个实例定义它ObjA.在这种情况下,后者更有效,因为它只分配了一次,而每次创建实例时都会分配本地方法ObjA.

所以用this.AlertA在:

var A = new ObjA, 
    B = new ObjA,
    C = new ObjA;
Run Code Online (Sandbox Code Playgroud)

对于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!
Run Code Online (Sandbox Code Playgroud)