Javascript: Module Pattern vs Constructor / Prototype pattern?

Chciałbym wiedzieć, czy wzór modułu lub wzór konstruktora / prototypu jest bardziej odpowiedni do mojej pracy.

Zasadniczo używam dyskretnego javascript -- dokument HTML ma odniesienie do .plik js.

Moje zrozumienie wzoru modułu:

  • wywołanie metody INIT (która jest w zasadzie metodą publiczną, którą mogę utworzyć i zwrócić używając wzorca modułu)
  • w metodzie INIT Przypisz wszystkie zdarzenia click itp.

To brzmi jak idealny wzór dla mojej sytuacji, ponieważ nie muszę tworzyć obiektów, hierarchii dziedziczenia itp.

Moje zrozumienie wzoru konstruktora / prototypu:

  • do tworzenia obiektów
  • do używania dziedziczenia (tj. podtypów supertypu)

Czy mam rację, że dla zapewnienia dyskretnego javascript, wzór modułu jest idealny?

Author: ataddeini, 2010-09-25

4 answers

Konstruktor-funkcje i prototypy są jednym z rozsądnych sposobów implementacji klas I instancji. Nie do końca odpowiadają temu modelowi, więc zazwyczaj musisz wybrać konkretny schemat lub metodę pomocniczą, aby zaimplementować klasy w kategoriach prototypów. (trochę tła o klasach w JS .)

Wzorzec modułu jest zwykle używany do przestrzeni nazw, gdzie pojedyncza instancja działa jako magazyn do grupowania powiązanych funkcji i obiektów. To jest inne zastosowanie sprawa z tego, do czego służy prototypowanie. Tak naprawdę nie konkurują ze sobą, można całkiem szczęśliwie używać obu razem (np. umieścić konstruktor-funkcję wewnątrz modułu i powiedzieć new MyNamespace.MyModule.MyClass(arguments)).

 66
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:14

Wzór modułu jest o wiele łatwiejszy i bardziej elegancki niż prototyp. Jednak najpierw myślenie mobilne. Nie jest to odpowiedni wzorzec dla średnich/dużych obiektów, ponieważ inicjalizacja musi przeanalizować cały blok przed uruchomieniem. Wiele zamknięć tworzy również okrągłe zależności, których garbage collector nie zwalnia (zwłaszcza IE), skutkuje to cięższym śladem pamięci nie zwalnianym, dopóki okno (lub karta) nie zostanie zamknięte-sprawdź Menedżera zadań chrome, aby porównać- Czas ładowania wynosi odwrotnie proporcjonalna do rozmiaru obiektu przy użyciu wzorca modułu, podczas gdy nie ma to miejsca w przypadku dziedziczenia prototypowego. Powyższe stwierdzenia są weryfikowane za pomocą wielu benchmarków, takich jak ten: http://jsperf.com/prototypal-performance/54

Jak widać w ostatnim teście. Małe obiekty są lepiej inicjalizowane jako zwykły obiekt (bez tych wzorców). Nadaje się do pojedynczych obiektów nie wymagających zamknięcia ani dziedziczenia. Mądrze jest ocenić, czy w ogóle potrzebujesz tych wzory.

 11
Author: Yann VR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-03 17:04:42

Możesz wypróbować wzór składania, oto link: Javascript Folding Pattern

Zostawiłam też odpowiedź na podobne pytanie, które pokazuje, jak korzystać ze wzoru składania:

Prosty przykład wzoru składania

 5
Author: intrepidis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:38

Prototype pattern pomaga nam rozszerzyć funkcjonalność i istnieje tylko jedna instancja funkcji w pamięci, niezależnie od liczby obiektów. W Module patter, każdy obiekt tworzy nową instancję funkcji w pamięci, ale zapewnia koncepcję prywatnych / publicznych zmiennych i pomaga w hermetyzacji zmiennych i funkcji.

 4
Author: user1662008,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-16 18:16:59