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

Модуль шаблона против экземпляра анонимного конструктора

Итак, это так называемый шаблон модуля для создания синглетонов с частными членами:

var foo = (function () {
    var _foo = 'private!';
    return {
        foo: function () { console.log(_foo); },
        bar: 'public!'
    }
})();

Там также этот метод, который я нашел сам по себе, но не видел ничего написанного о:

var foo = new function () {
    var _foo = 'private!';
    this.bar = 'public!';
    this.foo = function () { console.log(_foo); };
}

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

4b9b3361

Ответ 1

В этом случае кажется, что вы используете только один экземпляр этого класса ". Так что, возможно, захотите взглянуть на то, что Дуглас Крокфорд думает о помещая new непосредственно перед function:

Используя новый для вызова функции, объект удерживается на бесполезном объекте prototype. Это отнимает память без компенсирующего преимущества. Если мы не используем новое, мы не храним потраченный впустую прототип объекта в цепочке. Поэтому вместо этого мы будем ссылаться на функцию factory правильно, используя().

Итак, согласно известному архитектору Yahoo! вы должны использовать первый метод, и у вас есть причины.

Ответ 2

Больше или меньше, они дают вам тот же результат. Это просто вопрос того, какой путь вы хотите предпринять для этого.

Первый может быть более популярен, поскольку он просто представляет собой смесь из двух уже распространенных шаблонов:

(function closure() {
    var foo = 'private';
    /* ... */
}())

var singleton = {
    bar : 'public'
};

Тем не менее, цепочка prototype была бы преимуществом второго шаблона, поскольку у него есть свой собственный конструктор.

var singleton = new function Singleton() { };
assert(singleton.constructor !== Object);

singleton.constructor.prototype.foo = 'bar';
assert(singleton.foo === 'bar');

Ответ 3

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

С другой стороны, подход "шаблон модели" кажется наиболее распространенным и становится хорошо известным шаблоном (из-за роста в JQuery). Возможно, лучше придерживаться этого признанного шаблона не потому, что он имеет более технические достоинства, чем другой подход, а только потому, что он, вероятно, будет более узнаваем (несмотря на тяжелую пунктуацию).

Ответ 4

Дуглас Крокфорд пишет о втором. Как говорит Грег в своих комментариях, я думал, что это довольно часто, и я использовал его в прошлом.

Изменить: чтобы на самом деле ответить на ваш вопрос - нет нисходящих, два функционально эквивалентны (оба создают закрытие, содержащее "частные переменные" и публикование других переменных/методов), и имеют точно такую ​​же поддержку браузера и характеристики производительности, Это просто сводится к синтаксису - в основном, когда вы помещаете (), чтобы действительно вызвать эту функцию и получить свое закрытие, и используете ли вы ключевое слово new.