Подтвердить что ты не робот

Различные способы добавления функций в объект Javascript

В Javascript есть ли разница между этими двумя способами добавления функции к объекту? Желательно ли по какой-либо причине?

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

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

Ответ 1

Конечно, есть разница. Если вы определяете 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!

Ответ 2

Использование конструктора объекта назначит копию этой функции каждому новому экземпляру вашего объекта. Использование прототипирования приведет к тому, что одна функция будет использоваться для всех экземпляров.