В чем преимущество использования этого шаблона кодирования JavaScript для определения функций конструктора? - PullRequest
9 голосов
/ 16 февраля 2012

Я склонен писать конструкторы объектов следующим образом:

function Person(name) {
    this.name = name;
}
Person.prototype.greet = function () {
    alert("Hello! My name is " + this.name + ".");
};

Я заметил несколько библиотек JavaScript и фреймворков, добавляющих дополнительный код, например:

var Person = (function () {
    function Person(name) {
        this.name = name;
    }
    Person.prototype.greet = function () {
        alert("Hello! My name is " + this.name + ".");
    };
    return Person;
})();

Я знаю, для чего предназначена и используется самоисполняющаяся анонимная функция. На данный момент я не вижу, какое преимущество это дает при определении конструктора и его прототипа.

РЕДАКТИРОВАТЬ # 1:

Я знаю шаблон модуля и его преимущества и довольно часто использую его в своем коде. Моей ошибкой в ​​общении было неясно, что мой первый пример кода не должен быть в глобальной области видимости. Я всегда оборачиваю все свои внешние файлы JavaScript в самозаполняющуюся анонимную функцию, чтобы обеспечить локальную область видимости в коде.

Например:

;(function ( window, undefined ) {
    var p = function (name) {
        this.name;
    };
    p.prototype.greet = function () {
        alert("Hello! My name is " + this.name + ".");
    };
    window.Person = window.Person || p;
})(window);

Дело в том, что я видел технику, отображаемую во втором примере кода, использующую в такую ​​анонимную функцию.

Например:

;(function ( window, undefined ) {
    var p = (function () {
        var q = function (name) {
            this.name = name;
        };
        q.prototype.greet = function () {
            alert("Hello! My name is " + this.name + ".");
        };
        return q;
    })();
    window.Person = window.Person || p;
})(window);

Здесь я в растерянности из-за важности техники.

Ответы [ 4 ]

1 голос
/ 16 февраля 2012

Это фактически пространство имен, не так ли?

1 голос
/ 16 февраля 2012

Второй метод, шаблон модуля, является более переносимым.Обратите внимание, что вы можете присвоить Person любое имя.

При первом методе вам нужно будет отслеживать каждое вхождение Person, и будьте осторожны, чтобы случайно не удалить часть метода, когдакопирование конструктора + прототипа в другой проект.

Второй метод имеет дополнительное преимущество: вы можете использовать локальные / временные / одноразовые переменные, которые можно использовать для динамического определения констант / методов / свойств в пространстве имен.

0 голосов
/ 13 апреля 2012

Это ответ, который мой коллега, который обладает странным знанием не только JavaScript, но и того, как работают все различные механизмы JavaScript в браузерах, сказал мне, что этот шаблон кода является ненужным и чрезмерно защитным способом определения объектов. это используется для устранения сбоев в некоторых синтаксических анализаторах JavaScript (он специально цитировал версии Opera), которые допускают расширение области видимости. Это, конечно, звучит как разумный ответ ...

0 голосов
/ 16 февраля 2012

Я предпочитаю первое решение, меньше кода для меня яснее.

Я вижу второе решение лучше, только если вы часто копируете и вставляете свой код в другую библиотеку, но я не думаю, что это хорошая причина

...