instanceof
kontrole do wykonania w silnie wpisanych językach. Zamiast tego sprawdza tożsamość porównując obiekt __proto__
z właściwościąConstructor.prototype
.
nie będzie działać w różnych obszarach pamięci, takich jak iframes, na przykład(wspólne źródło błędów w 3rd party JavaScript osadza). Nie działa również, jeśli twój Constructor.prototype
zostanie zastąpiony.,
również się nie powiedzie, jeśli zaczniesz od klasy lub konstruktora (który zwraca this
, połączonego zConstructor.prototype
), a następnie przełączysz się na eksport dowolnego obiektu (nie połączonego zConstructor.prototype
), co dzieje się po zmianie konstruktora na fabryczny.
w skrócie,instanceof
jest innym sposobem, w którym przejście z konstruktora do fabryki jest zmianą przełomową.
zalety korzystania z klasy
- wygodna, samodzielna składnia.,
- pojedynczy, kanoniczny sposób emulowania klas w JavaScript. Przed ES6 istniało kilka konkurencyjnych implementacji w popularnych bibliotekach.
- bardziej znane osobom z klasowego środowiska językowego.
wady używania klasy
wszystkie wady konstruktora, plus:
- pokusa dla użytkowników do tworzenia problematycznych hierarchii klas za pomocą słowa kluczowego
extends
.,
hierarchie klas prowadzą do szeregu dobrze znanych problemów w projektowaniu obiektowym, w tym problemu kruchej klasy bazowej, problemu goryla banana, problemu powielania przez konieczność i tak dalej. Niestety, Klasa daje tak jak piłki pozwalają na rzucanie, a krzesła na siedzenie. Aby dowiedzieć się więcej, przeczytaj „dwa filary JavaScript: Prototypal OO” i „Inside the Dev Team Death Spiral”.,
warto zauważyć, że zarówno konstruktory, jak i fabryki mogą być również używane do tworzenia problematycznych hierarchii dziedziczenia, ale za pomocą słowa kluczowego `extends`, class tworzy affordance, który prowadzi Cię na złą ścieżkę. Innymi słowy, zachęca do myślenia w kategoriach nieelastycznych (i często błędnych) relacji jest-a, a nie bardziej elastycznego składu ma-a lub może-zrobić relacje.
affordance to funkcja, która daje możliwość wykonania określonej czynności., Na przykład, pokrętło umożliwia skręcanie, dźwignia umożliwia ciągnięcie, przycisk umożliwia naciśnięcie, itp…
korzyści z używania fabryk
fabryki są znacznie bardziej elastyczne niż funkcje konstruktorów lub klasy, i nie prowadzą ludzi na złą drogę, kusząc ich słowem kluczowym `extends` i głębokimi hierarchiami dziedziczenia. Istnieje wiele bezpieczniejszych mechanizmów ponownego użycia kodu, które powinieneś faworyzować nad dziedziczeniem klas, w tym funkcje i moduły.,
zwróć dowolny dowolny obiekt i użyj dowolnego prototypu
na przykład możesz łatwo tworzyć różne typy obiektów, które implementują ten sam interfejs API, np. odtwarzacz multimedialny, który może tworzyć instancje dla wielu typów treści wideo, które używają różnych interfejsów API pod maską, lub bibliotekę zdarzeń, która może emitować zdarzenia DOM lub zdarzenia gniazda sieciowego.
fabryki mogą również tworzyć instancje obiektów w różnych kontekstach wykonania, korzystać z pul obiektów i pozwalać na bardziej elastyczne modele dziedziczenia prototypów.,
bez obaw o refaktoryzację
nigdy nie będziesz musiał konwertować z fabryki na konstruktor, więc refaktoryzacja nigdy nie będzie problemem.
brak` nowego '
brak niejasności co do używania new
. Nie. (spowoduje to, że this
zachowa się źle, patrz następny punkt).
standardowe zachowanie `this`
this
zachowuje się tak, jak normalnie, więc możesz go użyć, aby uzyskać dostęp do obiektu nadrzędnego. Na przykład, wewnątrz player.create()
, this
odnosi się do odtwarzacza, tak jak każde inne wywołanie metody., call()
Iapply()
również zmienićthis
zgodnie z oczekiwaniami.
niektórzy ludzie lubią sposób, w jaki `myfoo = createFoo()` odczytuje
- nie tworzy łącza z instancji do
Factory.prototype
— ale jest to właściwie dobra rzecz, ponieważ nie otrzymasz zwodniczego instanceof
. Zamiast tego instanceof
zawsze się nie powiedzie. Zobacz korzyści.
-
this
nie odnosi się do nowego obiektu wewnątrz fabryki. Zobacz korzyści.,
- może działać wolniej niż funkcja konstruktora w testach mikro-optymalizacji. Powolna ścieżka jest nadal bardzo szybka-miliony operacji/SEK na starym komputerze. Jest to bardziej prawdopodobne w kodzie biblioteki lub frameworka niż w kodzie aplikacji. Zawsze porównuj z punktu widzenia użytkownika przed użyciem mikro-optymalizacji.
podsumowanie
moim zdaniem class
może mieć wygodną składnię, ale to nie może nadrobić faktu, że zwabia nieświadomych użytkowników do awarii na skałach dziedziczenia klas., Jest to również ryzykowne, ponieważ w przyszłości możesz chcieć uaktualnić do fabryki, ale wszyscy Twoi rozmówcy będą ściśle powiązani z funkcją konstruktora ze względu na słowo kluczowe new
I fakt, że przejście z klas do fabryki jest przełomową zmianą.
możesz myśleć, że możesz po prostu refaktorować strony połączeń, ale w dużych zespołach lub jeśli klasa, z którą pracujesz, jest częścią publicznego API, możesz złamać kod, który nie jest pod twoją kontrolą. Innymi słowy, nie zawsze można zakładać, że refaktoryzacja rozmówców jest nawet opcją.,
fajną rzeczą w fabrykach jest to, że są one nie tylko wydajniejsze i bardziej elastyczne, ale także najprostszym sposobem na zachęcenie całych zespołów i całych baz użytkowników API do korzystania z szablonów, które są proste, elastyczne i bezpieczne.