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

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

77 голосов | спросил codeholic 11 J000000Sunday10 2010, 00:23:41

7 ответов


0

Как ты нашел это?

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

Foobar.prototype = {
    foobar: null
};

Foobar.fromComponents = function(foo, bar) {
    var foobar = foo + bar;
    return new this(foobar);
};
ответил codeholic 13 J000000Tuesday10 2010, 00:16:54
0

В 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 не так уж и много.

ответил bobince 11 J000000Sunday10 2010, 01:29:11
0

Не хотелось делать это вручную, как в ответе Бобинса, поэтому я просто полностью сорвал шаблон параметров плагина jQuery.

Вот конструктор:

//default constructor for Preset 'class'
function Preset(params) {
    var properties = $.extend({
        //these are the defaults
        id: null,
        name: null,
        inItems: [],
        outItems: [],
    }, params);

    console.log('Preset instantiated');
    this.id = properties.id;
    this.name = properties.name;
    this.inItems = properties.inItems;
    this.outItems = properties.outItems;
}

Вот различные способы создания экземпляров:

presetNoParams = new Preset(); 
presetEmptyParams = new Preset({});
presetSomeParams = new Preset({id: 666, inItems:['item_1', 'item_2']});
presetAllParams = new Preset({id: 666, name: 'SOpreset', inItems: ['item_1', 'item_2'], outItems: ['item_3', 'item_4']});

И вот что это сделало:

presetNoParams
Preset {id: null, name: null, inItems: Array[0], outItems: Array[0]}

presetEmptyParams
Preset {id: null, name: null, inItems: Array[0], outItems: Array[0]}

presetSomeParams
Preset {id: 666, name: null, inItems: Array[2], outItems: Array[0]}

presetAllParams
Preset {id: 666, name: "SOpreset", inItems: Array[2], outItems: Array[2]}
ответил Jacob McKay 5 +04002014-10-05T07:09:42+04:00312014bEurope/MoscowSun, 05 Oct 2014 07:09:42 +0400 2014, 07:09:42
0

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

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

ответил eruciform 11 J000000Sunday10 2010, 00:32:23
0

Это пример для нескольких конструкторов в Программирование в HTML5 с использованием JavaScript и CSS3 - ссылка на экзамен .

function Book() {
    //just creates an empty book.
}


function Book(title, length, author) {
    this.title = title;
    this.Length = length;
    this.author = author;
}

Book.prototype = {
    ISBN: "",
    Length: -1,
    genre: "",
    covering: "",
    author: "",
    currentPage: 0,
    title: "",

    flipTo: function FlipToAPage(pNum) {
        this.currentPage = pNum;
    },

    turnPageForward: function turnForward() {
        this.flipTo(this.currentPage++);
    },

    turnPageBackward: function turnBackward() {
        this.flipTo(this.currentPage--);
    }
};

var books = new Array(new Book(), new Book("First Edition", 350, "Random"));
ответил Simon Stanford 2 Maypm17 2017, 23:21:00
0

Так что да, как было сказано выше, несколько решений, что вы видите в целом в таких вещах, как дата, это статические методы:

Date.UTC("some params"); 

Это не правильный конструктор, хотя это

function someObject(a,b,c,d,e,f) {
 a = a || "default";
 b = b || "defaultb"
}

Можно набрать машинку или перенести ее в es5?

constructor(a:string, b = "default value", c:number? //optional
) {

}
ответил Mathijs Segers 29 J000000Friday16 2016, 15:57:30
0

Я - Java-разработчик, который решает мою проблему в javascripts статическим методом

class MyClass {
    constructor(a,b,c,d){
        this.a = a
        this.b = b
        this.c = c
        this.d = d
    }
    static BAndCInstance(b,c){
        return new MyClass(null,b,c)
    }
    static BAndDInstance(b,d){
        return new MyClass(null,b, null,d)
    }
}

//new Instance just with a and other is nul this can
//use for other params that are first in constructor
const myclass=new MyClass(a)

//a Instance that has b and c params
const BAndC=MyClass.BAndCInstance(b,c)

//another example for b and d
const BAndD=MyClass.BAndDInstance(b,d)

с этим шаблоном вы можете создать мульти конструктор

ответил mahdi shahbazi 7 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 07 Sep 2018 08:19:41 +0300 2018, 08:19:41

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132