Шаблон JavaScript для нескольких конструкторов

Мне нужны различные конструкторы для моих экземпляров. Что такое общий шаблон для этого?

96
задан codeholic 10 July 2010 в 20:23
поделиться

3 ответа

Как вы его нашли?

function Foobar(foobar) {
    this.foobar = foobar;
}

Foobar.prototype = {
    foobar: null
};

Foobar.fromComponents = function(foo, bar) {
    var foobar = foo + bar;
    return new this(foobar);
};
28
ответ дан 24 November 2019 в 05:39
поделиться

В JavaScript нет перегрузки функций, в том числе для методов или конструкторов.

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

function foo(a, b) {
    if (b===undefined) // parameter was omitted in call
        b= 'some default value';

    if (typeof(a)==='string')
        this._constructInSomeWay(a, b);
    else if (a instanceof MyType)
        this._constructInSomeOtherWay(a, b);
}

Вы также можете обратиться к arguments как к массиву, чтобы получить любые другие переданные аргументы.

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

function bar(argmap) {
    if ('optionalparam' in argmap)
        this._constructInSomeWay(argmap.param, argmap.optionalparam);
    ...
}

bar({param: 1, optionalparam: 2})

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

108
ответ дан 24 November 2019 в 05:39
поделиться

Иногда значений по умолчанию для параметров достаточно для нескольких конструкторов. А когда этого недостаточно, я пытаюсь обернуть большую часть функциональности конструктора в функцию init (other-params), которая вызывается впоследствии. Также рассмотрите возможность использования концепции фабрики для создания объекта, который может эффективно создавать другие объекты, которые вы хотите.

http://en.wikipedia.org/w/index.php?title=Factory_method_pattern&oldid=363482142#Javascript

3
ответ дан 24 November 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: