Мне нужны разные конструкторы для моих экземпляров. Что общего для этого?
Шаблон JavaScript для нескольких конструкторов
Ответ 1
Как вы это найдете?
function Foobar(foobar) {
this.foobar = foobar;
}
Foobar.prototype = {
foobar: null
};
Foobar.fromComponents = function(foo, bar) {
var foobar = foo + bar;
return new this(foobar);
};
Ответ 2
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, не так много.
Ответ 3
Не хотелось делать это вручную, как в ответе bobince, поэтому я просто полностью сорвал шаблон jQuery plugin options.
Здесь конструктор:
//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]}
Ответ 4
Идя дальше с эрудиформным ответом, вы можете связать свой вызов new
с вашим методом init
.
function Foo () {
this.bar = 'baz';
}
Foo.prototype.init_1 = function (bar) {
this.bar = bar;
return this;
};
Foo.prototype.init_2 = function (baz) {
this.bar = 'something to do with '+baz;
return this;
};
var a = new Foo().init_1('constructor 1');
var b = new Foo().init_2('constructor 2');
Ответ 5
Иногда значения по умолчанию для параметров достаточно для нескольких конструкторов. И когда этого не достаточно, я пытаюсь перенести большую часть функциональности конструктора в функцию init (other-params), которая вызывается впоследствии. Также рассмотрите возможность использования концепции factory для создания объекта, который может эффективно создавать другие объекты, которые вы хотите.
http://en.wikipedia.org/w/index.php?title=Factory_method_pattern&oldid=363482142#Javascript
Ответ 6
Это пример, приведенный для нескольких конструкторов в Программирование в 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"));
Ответ 7
Итак, да, как указано выше, несколько решений, что вы видите вообще в таких вещах, как дата, это статические методы:
Date.UTC("some params");
Это не правильный конструктор, хотя, хотя
function someObject(a,b,c,d,e,f) {
a = a || "default";
b = b || "defaultb"
}
Может пойти typescript или перевести его на es5?
constructor(a:string, b = "default value", c:number? //optional
) {
}
Ответ 8
вы можете использовать класс со статическими методами, которые возвращают экземпляр этого класса
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)
с помощью этого шаблона вы можете создать мульти конструктор