Czy klasy / obiekty JavaScript mogą mieć konstruktory? Jak są tworzone?
javascript
oop
Kliknij opcję Upvote
źródło
źródło
Odpowiedzi:
Korzystanie z prototypów:
Ukrywanie „koloru” (nieco przypomina prywatną zmienną członka):
Stosowanie:
źródło
color
. Sugeruję, że używasz w dużej mierze zależy od osobistych preferencji (ochrona kontra prostota)var
tworzy zmienną prywatną.this
tworzy zmienną publicznąFoo
, podczas gdy w drugim przypadku będzie wiedział, żeFoo
jest wywoływany. Bardzo pomocne przy debugowaniu.Oto szablon, którego czasami używam do zachowania podobnego do OOP w JavaScript. Jak widać, można symulować członków prywatnych (zarówno statycznych, jak i instancji) przy użyciu zamknięć. To,
new MyClass()
co zwróci, to obiekt z jedynie właściwościami przypisanymi dothis
obiektu iprototype
obiektu „klasy”.Zapytano mnie o dziedziczenie przy użyciu tego wzorca, więc oto:
I przykład wykorzystania tego wszystkiego:
Jak widać, klasy poprawnie komunikują się ze sobą (współdzielą statyczny identyfikator z
MyClass
,announce
metoda używa poprawnejget_name
metody itp.)Należy zwrócić uwagę na potrzebę ukrywania właściwości instancji. W rzeczywistości można sprawić, aby
inherit
funkcja przechodziła przez wszystkie właściwości instancji (za pomocąhasOwnProperty
), które są funkcjami, i dodawałasuper_<method name>
właściwość automatycznie . Pozwoliłoby to zadzwonićthis.super_get_name()
zamiast przechowywać go w wartości tymczasowej i nazwać go związanym za pomocącall
.W przypadku metod na prototypie nie musisz się jednak przejmować powyższym, jeśli chcesz uzyskać dostęp do metod prototypowych superklasy, możesz po prostu zadzwonić
this.constructor.super.prototype.methodName
. Jeśli chcesz, aby było mniej gadatliwe, możesz oczywiście dodać właściwości wygody. :)źródło
cls.prototype
części: „współdzielone między instancjami” służy tylko do odczytu wartości (wywołanieannounce
). Jeśli ustawiszmyClassInstance.announce
inną wartość, tworzy ona nową właściwość wmyClassInstance
, więc ma zastosowanie tylko do tego obiektu, a nie do innych instancji klasy. Przypisanie doMyClass.prototype.announce
wpłynie jednak na wszystkie instancje.MyClass.get_nextId()
Wydaje mi się, że większość z was podaje przykłady programów pobierających i ustawiających, a nie konstruktorów, tj. Http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming) .
lunched-dan był bliżej, ale przykład nie działał w jsFiddle.
W tym przykładzie tworzona jest funkcja prywatnego konstruktora, która działa tylko podczas tworzenia obiektu.
Jeśli chcesz przypisać właściwości publiczne, konstruktor można zdefiniować jako taki:
źródło
Box()
funkcją :). Ale ten przykład, jak również przykłady w innych odpowiedziach, można łatwo rozszerzyć na parametry.Box
funkcji i możesz zacząć (jest to nadal „prywatny”). „Prywatne” w Javascript oznacza po prostu dostępne w zakresie leksykalnym; nie trzeba przypisywać członków. Dodatkowo: ten kod jest nieprawidłowy. Tworzy__construct
zmienną globalną , co jest dość złe.var
należy stosować w celu ograniczenia zakresu__construct
.Celem właściwości konstruktora jest zapewnienie sposobu udawania, że JavaScript ma klasy. Jedną z rzeczy, których nie możesz zrobić, jest zmiana konstruktora obiektu po jego utworzeniu. To skomplikowane.
Kilka lat temu napisałem dość obszerny artykuł: http://joost.zeekat.nl/constructors-consisted-mildly-confusing.html
źródło
Przykład tutaj: http://jsfiddle.net/FZ5nC/
Wypróbuj ten szablon:
Musisz dostosować przestrzeń nazw, jeśli definiujesz klasę statyczną:
Przykładowa klasa:
Przykładowa instancja:
Funkcje powiadomień są zdefiniowane jako AB = funkcja A_B (). Ma to na celu ułatwienie debugowania skryptu. Otwórz panel Inspect Element w Chrome, uruchom ten skrypt i rozwiń ślad debugowania:
źródło
To jest konstruktor:
Kiedy to zrobisz
MyClass
jest wykonywany i zwracany jest nowy obiekt tej klasy.źródło
alert(valuePassedInAsArgument);
że będzie to działać raz dla każdej instancji, więc cała klasa jest konstruktorem.new object is returned of that class
- czy to nie bardziej, że zwracany jest nowy obiekt tej funkcji?Uważam ten samouczek za bardzo przydatny. Takie podejście jest stosowane przez większość wtyczek jQuery.
http://www.htmlgoodies.com/html5/tutorials/create-an-object-oriented-javascript-class-constructor.html#fbid=OVYAQL_TDpK
Teraz ,
źródło
klass
Ten wzór mi dobrze służył. Za pomocą tego wzorca tworzysz klasy w osobnych plikach, ładujesz je do swojej ogólnej aplikacji „w razie potrzeby”.
źródło
var
w konstruktorze (lub argumencie funkcji lub w funkcji podobnej do konstruktora).Tak, możesz zdefiniować konstruktor w deklaracji klasy w następujący sposób:
źródło
Myślę, że opublikuję to, co robię z zamknięciem javascript, ponieważ nikt jeszcze nie używa zamknięcia.
Komentarze i sugestie dotyczące tego rozwiązania są mile widziane. :)
źródło
Korzystając z powyższej próbki Nicka, możesz utworzyć konstruktor dla obiektów bez parametrów, używając instrukcji return jako ostatniej instrukcji w definicji obiektu. Zwróć swoją funkcję konstruktora jak poniżej, a będzie ona uruchamiała kod w __construct za każdym razem, gdy tworzysz obiekt:
źródło
this.getColor();
linii powyżej,alert("Object Created.");
nic nie zostanie ostrzeżone. Wystąpi błąd w rodzaju „getColor nie jest zdefiniowany”. Jeśli chcesz, aby konstrukcja mogła wywoływać inne metody w obiekcie, musisz zdefiniować ją po wszystkich innych metodach. Więc zamiast wywoływać__construct();
ostatnią linię, po prostu zdefiniuj konstrukt tam i wstaw()
po nim, aby wymusić automatyczne wykonanie.()
na końcu definicji __construct nadal powodowało błąd. Musiałem wywołać__construct();
własną linię, tak jak w oryginalnym kodzie, aby uniknąć błędu.Może stało się to trochę prostsze, ale poniżej przedstawiłem to, co wymyśliłem w 2017 roku:
Korzystając z powyższej klasy, mam następujące elementy:
Jak widać, konstruktor przyjmuje dwa parametry, a my ustawiamy właściwości obiektu. Zmieniamy również kolor i kształt obiektu za pomocą
setter
funkcji i udowadniamy, że jego zmiana pozostała po wywołaniugetInfo()
po tych zmianach.Trochę za późno, ale mam nadzieję, że to pomoże. Przetestowałem to za pomocą
mocha
testów jednostkowych i działa dobrze.źródło
Robią to, jeśli używasz Typescript - open source od MicroSoft :-)
Maszynopis pozwala „fałszować” konstrukcje OO, które są kompilowane w konstrukcje javascript. Jeśli zaczynasz duży projekt, możesz zaoszczędzić dużo czasu i właśnie osiągnął wersję milestone 1.0.
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf
Powyższy kod zostaje „skompilowany” w celu:
źródło
W JavaScript typ wywołania określa zachowanie funkcji:
func()
obj.func()
new func()
func.call()
lubfunc.apply()
Funkcja jest wywoływana jako konstruktor podczas wywoływania za pomocą
new
operatora:Każda instancja lub obiekt prototypowy w JavaScript ma właściwość
constructor
, która odnosi się do funkcji konstruktora.Sprawdź ten post na temat właściwości konstruktora.
źródło
Korzystając z doskonałego szablonu Blixta z góry, dowiedziałem się, że nie działa dobrze z dziedziczeniem wielopoziomowym (MyGrandChildClass rozszerzającym MyChildClass rozszerzającym MyClass) - cyklicznie przywoływanie konstruktora pierwszego rodzica w kółko. Oto proste obejście - jeśli potrzebujesz dziedziczenia wielopoziomowego, zamiast
this.constructor.super.call(this, surName);
korzystaćchainSuper(this).call(this, surName);
z funkcji łańcucha zdefiniowanej w ten sposób:źródło
http://www.jsoops.net/ jest całkiem dobry dla oop w Js. Jeśli zapewnia prywatną, chronioną, publiczną zmienną i funkcję, a także funkcję dziedziczenia. Przykładowy kod:
źródło
żeby zaoferować trochę różnorodności. ds.oop to dobry sposób na deklarowanie klas za pomocą konstruktorów w javascript. Obsługuje każdy możliwy typ dziedziczenia (w tym 1 typ, który nie obsługuje nawet c #), a także interfejsy, co jest miłe.
źródło
Tutaj musimy zauważyć jeden punkt w skrypcie java, jest to język bezklasowy, jednak możemy to osiągnąć za pomocą funkcji w skrypcie java. Najczęstszym sposobem osiągnięcia tego celu jest utworzenie funkcji w skrypcie Java i użycie nowego słowa kluczowego do utworzenia obiektu oraz użycie tego słowa kluczowego do zdefiniowania właściwości i metod. Poniżej znajduje się przykład.
źródło
W większości przypadków musisz jakoś zadeklarować właściwość, której potrzebujesz, zanim będziesz mógł wywołać metodę przekazującą te informacje. Jeśli nie musisz początkowo ustawiać właściwości, możesz po prostu wywołać metodę w obiekcie w ten sposób. Prawdopodobnie nie jest to najpiękniejszy sposób na zrobienie tego, ale nadal działa.
źródło