Модули Javascript: вернуть пустой объект или назвать его - PullRequest
3 голосов
/ 15 декабря 2011

Используя шаблон модуля Javascript, каковы преимущества / недостатки возврата пустого объекта, содержащего интерфейс, по сравнению с созданием именованного объекта, содержащего интерфейс, с возвратом ссылки? Пример кода ниже. Я всегда помещаю интерфейс в именованный объект, и одно преимущество, которое я вижу в этом, заключается в том, что я могу выполнить некоторую отладку, прежде чем вернуть его.

function bareObjectModule() {
    return {
        method1: function() {}
        //etc.
    }
}

function namedObjectModule() {
    var namedObjectModule = {
        method1: function() {}
    }

    //debug here?
    return namedObjectModule;
}

Ответы [ 3 ]

3 голосов
/ 15 декабря 2011

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

var M = {};
M.f1 = function(){ ... };

M.f2 = function(){  M.f1() }; //functions can reference each other without
                              // a fragile dynamic binding through `this`

M.f3 = some_combinator(M.f2); //since you are not limited to defining things as 
                              //property-value pairs you have much more flexibility..

return M;
2 голосов
/ 15 декабря 2011

Кроме упомянутого вами преимущества отладки, я не вижу никакой разницы в двух подходах.Поскольку namedObjectModule является функцией local, он все равно будет отброшен, когда функция вернется (то есть имя переменной в стеке).

Одна второстепенная точка может заключаться в том, что для именованного объекта будет существовать запись в стеке для локальной переменной namedObjectModule (будет выдана после возврата из функции), и в функции будет записьстек вызовов (к тому же объекту) для возврата к работе.С голым предметом можно избежать первого.Не уверен, оказывает ли это реальное влияние на производительность, если в стеке нет тысяч объектов.

1 голос
/ 15 декабря 2011

Основное отличие состоит в том, что с указанным объектом вы можете использовать свойства и вызывать методы из других методов. Вы не можете сделать это с одним литералом объекта.

В качестве альтернативы обоим подходам вы можете вызвать включающую функцию в качестве конструктора (с new) и вернуть ей this объект для экспорта модуля.

var myModule = new function () {
    this.methodA = function () { /* ... */ }

    this.methodB = function () { /* ... */ }

    console.log(this) // debug
}

Нет необходимости вводить return явно (конструкторы возвращают this по умолчанию) и определять литерал объекта (и придумывать имя) в качестве бонуса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...