Potrzebuję różnych konstruktorów dla moich wystąpień. Jaki jest wspólny wzór do tego?Wzorzec JavaScript dla wielu konstruktorów
Odpowiedz
Jak znaleźć ten?
function Foobar(foobar) {
this.foobar = foobar;
}
Foobar.prototype = {
foobar: null
};
Foobar.fromComponents = function(foo, bar) {
var foobar = foo + bar;
return new this(foobar);
};
wróć nowe to (foobar); nie działa. Zmieniam po powrocie nowy Foobar (foobar); i wszystko działa poprawnie. – isxaker
Nie rozumiem. Czy możesz dodać kod, w którym faktycznie go używasz? Czy za każdym razem będziesz musiał dzwonić z Components? Ponieważ nie jest to naprawdę konstruktor, ale raczej funkcja pomocnicza. @ Odpowiedź bobince wydaje się wtedy bardziej dokładna. – hofnarwillie
Jeśli to * działa *, jest to skomplikowany wzorzec. –
Czasami wartości domyślne parametrów są wystarczające dla wielu konstruktorów. A gdy to nie wystarcza, staram się łączyć większość funkcji konstruktora w funkcję init (other-params), która jest wywoływana później. Rozważ także użycie koncepcji fabryki, aby utworzyć obiekt, który może skutecznie tworzyć inne obiekty, które chcesz.
http://en.wikipedia.org/w/index.php?title=Factory_method_pattern&oldid=363482142#Javascript
Metoda fabryczna to dobre rozwiązanie - pamiętaj, aby nie mylić jej z użyciem osobnej klasy fabrycznej, co prawdopodobnie nie ma znaczenia w tym przypadku. –
Ten link nie prowadzi do nikąd. Na tej stronie nie ma kotwicy Javascript. – Rob
wskazał na starą wersję. wiki usunięto przykłady js. – eruciform
JavaScript nie ma przeciążania funkcji, w tym metod lub konstruktorów.
Jeśli chcesz, aby funkcja zachowywała się inaczej, w zależności od liczby i typów przekazywanych parametrów, musisz ręcznie je wykryć. JavaScript z przyjemnością wywoła funkcję z mniejszą lub większą liczbą niż zadeklarowana liczba argumentów.
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);
}
Można również uzyskać dostęp arguments
jako tablica-jak uzyskać wszelkie dalsze argumenty przekazane w.
Jeśli potrzebujesz bardziej złożone argumenty, to może być dobry pomysł, aby umieścić niektóre lub wszystkie z nich wewnątrz odnośnika obiektu:
function bar(argmap) {
if ('optionalparam' in argmap)
this._constructInSomeWay(argmap.param, argmap.optionalparam);
...
}
bar({param: 1, optionalparam: 2})
Python pokazuje, jak domyślne i nazwane argumenty mogą zostać wykorzystane na pokrycie większości przypadków użycia w bardziej praktycznym i wdzięku sposób niż funkcja przeciążenia. JavaScript, nie tak bardzo.
Dzięki, to jest naprawdę miłe. Powiedziałbym, że druga opcja jest użyteczna nie tylko wtedy, gdy masz złożone argumenty, ale także proste, ale trudne do odróżnienia argumenty, np. obsługa 'MyObj ({foo:" foo "})' plus 'MyObj ({bar:" bar "})'. MyObj ma dwa konstruktory - ale oba przyjmują jeden argument, który jest ciągiem :-) –
Czy możesz dodać więcej do kodu przykładowego dla tego konkretnego przykładu. –
Witam @DougHauf, książka Crockforda "JavaScript: The Good Parts" zawiera sekcję o nazwanych "Specyfikatorach obiektów", wiele przykładów odnosi się do niej online. –
Idąc dalej z odpowiedzią eruciform, można łańcuch rozmowy new
do swojego sposobu init
ty.
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');
Więc w zasadzie to, co tu robisz, zabiera obiekt Foo, a następnie wywołuje parametry init_1 i init_2 z funkcjami prototypu. Jeśli twój init_1 i init_2 mają funkcję słowa z nimi. –
czy musi być średnik po znaku} w pierwszym Foo(). –
Dzięki Doug, dokonałem zmiany. – laughingbovine
nie miał ochoty robić to ręcznie, jak w odpowiedzi bobince, więc ja po prostu całkowicie oszukany jQuery plugin opcji wzór.
Oto konstruktor:
//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;
}
Oto różne sposoby konkretyzacji:
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']});
A oto, co to wykonane:
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]}
Zrobiłem ten sam wzorzec w pliku node.js również teraz z: https://www.npmjs.com/package/extend –
Więc tak jak sformułowane wcześniej, wiele rozwiązań, to, co widzisz ogólnie w takich datach, to statyczne metody:
Date.UTC("some params");
To nie jest właściwy konstruktor chociaż, to chociaż
function someObject(a,b,c,d,e,f) {
a = a || "default";
b = b || "defaultb"
}
można iść maszynopis lub transpile go ES5?
constructor(a:string, b = "default value", c:number? //optional
) {
}
Jest to przykład podany dla wielu konstruktorów w Programming in HTML5 with JavaScript and CSS3 - Exam Ref.
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"));
i niezmienność? używanie prototypu powoduje, że właściwości są publiczne, prawda? –
- 1. Dekorator wzorzec dla klas z wielu właściwości
- 2. Podpowiedź typów i wielu konstruktorów
- 3. Wzorzec biblioteki JavaScript
- 4. Wzorzec mediatora w JavaScript Pytania
- 5. Wzorzec modułu JavaScript - chronione elementy?
- 6. Wzorzec obserwatora dla stopera
- 7. Wzorzec projektowy Alternatywa dla Coroutines
- 8. Wzorzec projektowy dla czasu aplikacji?
- 9. Odpowiedni wzorzec dla klasy ActiveRecord
- 10. Wzorzec obiektu kwerendy (wzorzec projektu)
- 11. Wiele konstruktorów w python?
- 12. Zależne typy nie działają dla konstruktorów?
- 13. Adnotacja dla różnych konstruktorów w Lombok?
- 14. Nie deserializacji klas z wielu konstruktorów z Json.NET
- 15. Nadpisywanie konstruktorów
- 16. JavaScript w wielu plikach
- 17. Grep dla wielu wzorców na wielu plikach
- 18. Jak wzorzec pasuje do wielu wartości w Scali?
- 19. Wzorzec WSATCoordinator w aplikacji internetowej jest mapowany do wielu Serwletów
- 20. Wzorzec Java dla zagnieżdżonych wywołań zwrotnych?
- 21. Jak ustawić wzorzec dla wiadomości zatwierdzania git?
- 22. Regex wzorzec dla tekstu między 2 ciągi
- 23. Wzorzec projektu dla iPhone'a Core Data
- 24. Java Widoczność Pamięci Konstruktorów
- 25. Zamówienie wywołań konstruktorów
- 26. Korzyści z generycznych konstruktorów
- 27. C#: dziedziczenie konstruktorów
- 28. Wzorzec, aby uniknąć licznika komunikatów w pojedynczej aplikacji dla wielu wystąpień
- 29. Wzorzec modułu JavaScript, funkcje zagnieżdżone i moduły podrzędne
- 30. Jak ten wzorzec jest wywoływany w JavaScript? czy ma imię?
być nieco bardziej specyficzny proszę. chcesz konstruktorów z różnymi zestawami parametrów? – galambalazs
@galambalazs Tak. – codeholic
Czy możesz mieć więcej niż jeden konstruktor w JavaScript? –