Wolę używać OOP w dużych projektach, takich jak ten, nad którym teraz pracuję. Muszę utworzyć kilka klas w JavaScript, ale jeśli się nie mylę, istnieje co najmniej kilka sposobów na zrobienie tego. Jaka byłaby składnia i dlaczego miałaby być wykonana w ten sposób?
Chciałbym uniknąć korzystania z bibliotek stron trzecich - przynajmniej na początku.
Szukając innych odpowiedzi, znalazłem artykuł Programowanie obiektowe w JavaScript, Część I: Dziedziczenie - Doc JavaScript, który omawia programowanie obiektowe w JavaScript. Czy istnieje lepszy sposób na dziedziczenie?
javascript
oop
class
Karim
źródło
źródło
Odpowiedzi:
Oto sposób na zrobienie tego bez użycia zewnętrznych bibliotek:
Teraz prawdziwa odpowiedź jest o wiele bardziej złożona. Na przykład nie ma czegoś takiego jak klasy w JavaScript. JavaScript używa
prototype
opartego na schemacie dziedziczenia.Ponadto istnieje wiele popularnych bibliotek JavaScript, które mają swój własny styl przybliżania klasowej funkcjonalności w JavaScript. Będziesz chciał sprawdzić przynajmniej Prototyp i jQuery .
Zdecydowanie, który z nich jest „najlepszy”, jest świetnym sposobem na rozpoczęcie świętej wojny na przepełnieniu stosu. Jeśli bierzesz udział w większym projekcie, w którym jest dużo JavaScript, zdecydowanie warto nauczyć się popularnej biblioteki i zrobić to po swojemu. Jestem prototypem, ale Stack Overflow wydaje się skłaniać ku jQuery.
O ile istnieje tylko „jeden sposób na zrobienie tego”, bez żadnych zależności od bibliotek zewnętrznych, sposób, w jaki napisałem, jest w zasadzie taki.
źródło
Najlepszym sposobem zdefiniowania klasy w JavaScript jest brak zdefiniowania klasy.
Poważnie.
Istnieje kilka różnych rodzajów orientacji obiektowej, niektóre z nich to:
I prawdopodobnie inne, o których nie wiem.
JavaScript implementuje OO oparte na prototypach. W OO opartym na prototypach nowe obiekty są tworzone przez kopiowanie innych obiektów (zamiast tworzenia instancji z szablonu klasy), a metody żyją bezpośrednio w obiektach zamiast w klasach. Dziedziczenie odbywa się poprzez przekazanie: jeśli obiekt nie ma metody ani właściwości, jest sprawdzany na swoim prototypie (obiektach, z których został sklonowany), a następnie na prototypach prototypu i tak dalej.
Innymi słowy: nie ma klas.
JavaScript ma całkiem niezłą modyfikację tego modelu: konstruktorów. Nie tylko możesz tworzyć obiekty poprzez kopiowanie istniejących, ale możesz też konstruować je „z powietrza”, że tak powiem. Jeśli wywołasz funkcję za pomocą
new
słowa kluczowego, funkcja ta stanie się konstruktorem, athis
słowo kluczowe nie będzie wskazywało na bieżący obiekt, lecz na nowo utworzony „pusty”. Możesz więc skonfigurować obiekt w dowolny sposób. W ten sposób konstruktory JavaScript mogą przyjąć jedną z ról klas w tradycyjnym OO opartym na klasach: służąc jako szablon lub plan dla nowych obiektów.Teraz JavaScript jest bardzo potężnym językiem, więc jeśli chcesz, możesz łatwo wdrożyć oparty na klasach system OO w JavaScript . Jednak powinieneś to zrobić tylko wtedy, gdy naprawdę tego potrzebujesz, a nie tylko dlatego, że tak właśnie robi Java.
źródło
Klasy ES2015
W specyfikacji ES2015 można użyć składni klasy, która jest po prostu cukrem w stosunku do prototypowego systemu.
Korzyści
Główną zaletą jest to, że narzędziom do analizy statycznej łatwiej jest ukierunkować tę składnię. Łatwiej jest również innym osobom pochodzącym z języków klasowych używać języka jako poliglota.
Ostrzeżenia
Uważaj na jego obecne ograniczenia. Aby uzyskać własności prywatne, należy skorzystać z symboli lub słabych map . W przyszłych wydaniach klasy najprawdopodobniej zostaną rozszerzone o te brakujące funkcje.
Wsparcie
Obsługa przeglądarek nie jest w tej chwili zbyt dobra (obsługiwana przez prawie wszystkich oprócz IE), ale możesz teraz korzystać z tych funkcji za pomocą transpilatora takiego jak Babel .
Zasoby
źródło
Wolę używać Daniela X. Moore'a
{SUPER: SYSTEM}
. Jest to dyscyplina, która zapewnia korzyści, takie jak zmienne rzeczywistych instancji, dziedziczenie oparte na cechach, hierarchie klas i opcje konfiguracji. Poniższy przykład ilustruje użycie prawdziwych zmiennych instancji, które moim zdaniem są największą zaletą. Jeśli nie potrzebujesz zmiennych instancji i jesteś zadowolony z samych zmiennych publicznych lub prywatnych, prawdopodobnie istnieją prostsze systemy.Wow, to nie jest zbyt przydatne, ale spójrz na dodanie podklasy:
Kolejną zaletą jest możliwość dziedziczenia modułów i cech.
Przykład posiadania klasy person obejmuje moduł do powiązania.
Ujawnienie: Jestem Daniel X. Moore i to jest moje
{SUPER: SYSTEM}
. Jest to najlepszy sposób na zdefiniowanie klasy w JavaScript.źródło
źródło
Poniżej znajdują się sposoby tworzenia obiektów w javascript, których do tej pory używałem
Przykład 1:
Przykład 2:
Przykład 3:
Przykład 4: Rzeczywiste zalety Object.create (). sprawdź [ten link]
Przykład 5 (dostosowany obiekt Crockforda. Tworzenie):
Aby aktualizować odpowiedź za pomocą ES6 / ES2015
Klasa jest zdefiniowana w następujący sposób:
źródło
Myślę, że powinieneś przeczytać Douglas Crockford Prototypal Inheritance in JavaScript and Classical Inheritance in JavaScript .
Przykłady z jego strony:
Efekt? Umożliwi to dodanie metod w bardziej elegancki sposób:
Polecam także jego filmy: Advanced JavaScript .
Więcej filmów można znaleźć na jego stronie: http://javascript.crockford.com/ W książce Johna Reisiga można znaleźć wiele przykładów ze strony Douglasa Crockfora.
źródło
'strings'
jak wiele nazw, ale elegancki nie jest jedną z nich ...Ponieważ nie zaakceptuję planu fabryki YUI / Crockford i ponieważ lubię utrzymywać wszystko w spokoju i rozszerzać, oto moja odmiana:
gdzie najlepiej jest przeprowadzić test typu na prototypie pierwszej metody
źródło
Jeśli wybierasz proste, możesz całkowicie uniknąć słowa kluczowego „nowy” i po prostu użyć metod fabrycznych. Czasami wolę to, ponieważ lubię używać JSON do tworzenia obiektów.
Nie jestem jednak pewien, jaka jest wydajność w przypadku dużych obiektów.
źródło
W ten sposób TypeScript kompiluje klasę z konstruktorem do JavaScript.
źródło
Prosty sposób to:
Powodem
that
jest to, żethis
można powiązać z czymś innym, jeśli podasz metodę jako procedurę obsługi zdarzeń, więc zapiszesz wartość podczas tworzenia wystąpienia i użyjesz jej później.Edycja: zdecydowanie nie jest to najlepszy sposób, tylko prosty sposób. Czekam też na dobre odpowiedzi!
źródło
Prawdopodobnie chcesz utworzyć typ za pomocą wzoru składania:
Ten kod da ci typ o nazwie myType . Będzie miał wewnętrzne pola prywatne o nazwie przełączanie i tekst . Będzie także miał tych odsłoniętych członków: liczba pól i liczby ; przełącznik właściwości , tekst i liczba Długość ; metody incrementNumbersByCount i tweak .
Wzór składania jest szczegółowo opisany tutaj: Wzór składania Javascript
źródło
Golf kod dla użytkownika @ liammclennan odpowiedź .
źródło
MooTools (My Object Oriented Tools) koncentruje się na idei klas . Możesz nawet rozszerzyć i wdrożyć z dziedziczeniem.
Po opanowaniu tworzy absurdalnie potężny javascript.
źródło
Klasy obiektowe z dziedziczeniem
Proste, słodkie i gotowe.
źródło
Baza
Klasa
Akcja
źródło
Na przykładzie Tryptyku może to być jeszcze prostsze:
Tworzy to tylko instancję pojedynczego obiektu, ale nadal jest przydatne, jeśli chcesz zawrzeć grupę nazw zmiennych i metod w klasie. Zwykle do konstruktora nie byłyby argumenty „Bob, M”, na przykład, gdyby metody były wywołaniami systemu z własnymi danymi, takimi jak baza danych lub sieć.
Nadal jestem zbyt nowy w JS, żeby zrozumieć, dlaczego to nie wykorzystuje
prototype
.źródło
JavaScript jest zorientowany obiektowo , ale radykalnie różni się od innych OOP języków , takich jak Java, C # lub C ++. Nie próbuj tego tak rozumieć. Wyrzuć tę starą wiedzę i zacznij od nowa. JavaScript wymaga innego myślenia.
Sugerowałbym, aby uzyskać dobry podręcznik lub coś na ten temat.
Sam uważam, że samouczki ExtJS są dla mnie najlepsze, chociaż nie korzystałem z frameworka przed ani po jego przeczytaniu. Ale daje dobre wyjaśnienie tego, co jest w świecie JavaScript.Przepraszamy, ta treść została usunięta. Oto link do archiwum.org zamiast tego. Działa dzisiaj. : Pźródło
źródło