Do tej pory widziałem trzy sposoby tworzenia obiektu w JavaScript. Który sposób jest najlepszy do tworzenia obiektu i dlaczego?
Widziałem również, że we wszystkich tych przykładach słowo kluczowe var
nie jest używane przed właściwością - dlaczego? Czy nie jest konieczne zadeklarowanie var
przed nazwą właściwości, ponieważ wspomniano, że właściwości są zmiennymi?
W drugim i trzecim przypadku nazwa obiektu jest zapisana wielkimi literami, w pierwszym przypadku nazwa obiektu jest pisana małymi literami. Jakiego przypadku powinniśmy użyć dla nazwy obiektu?
Pierwszy sposób:
function person(fname, lname, age, eyecolor){
this.firstname = fname;
this.lastname = lname;
this.age = age;
this.eyecolor = eyecolor;
}
myFather = new person("John", "Doe", 50, "blue");
document.write(myFather.firstname + " is " + myFather.age + " years old.");
Drugi sposób:
var Robot = {
metal: "Titanium",
killAllHumans: function(){
alert("Exterminate!");
}
};
Robot.killAllHumans();
Trzeci sposób - obiekty JavaScript wykorzystujące składnię tablicową:
var NewObject = {};
NewObject['property1'] = value;
NewObject['property2'] = value;
NewObject['method'] = function(){ /* function code here */ }
javascript
object
Jamna
źródło
źródło
var
, proszę ... pomijanie tego sprawia, że stają się one globalneObject.create()
:?Odpowiedzi:
Nie ma najlepszego sposobu, zależy to od twojego przypadku użycia.
Person
naszym przykładzie (nazwę należy rozpocząć od dużej litery) nazywamy funkcją konstruktora . Jest to podobne do zajęć w innych językach obiektowych.Aktualizacja: zgodnie z żądanymi przykładami dla trzeciego sposobu.
Zależne właściwości:
Poniższa nie działa jak
this
ma nie dotycząbook
. Nie ma możliwości zainicjowania właściwości wartościami innych właściwości w literale obiektu:zamiast tego możesz zrobić:
Dynamiczne nazwy właściwości:
Jeśli nazwa właściwości jest przechowywana w jakiejś zmiennej lub utworzona za pomocą jakiegoś wyrażenia, musisz użyć notacji nawiasowej:
źródło
...
do dziedziczenia z innego obiektu?Istnieje wiele sposobów definiowania funkcji. Jest całkowicie oparty na twoich wymaganiach. Poniżej znajduje się kilka stylów: -
Przykłady:
Możesz to wypróbować na konsoli, jeśli masz jakieś zamieszanie.
źródło
var person
instancję? na przykład w konstruktorze funkcji możesz po prostu dodaćvar person = new Person("Anand")
. i o co chodzi z pozornie przypadkowym użyciem średnika? : PNie ma „najlepszego sposobu” tworzenia obiektu. Każdy sposób ma zalety w zależności od przypadku użycia.
Wzorzec konstruktora (funkcja sparowana z
new
operatorem w celu jej wywołania) zapewnia możliwość korzystania z dziedziczenia prototypowego, podczas gdy inne sposoby nie. Jeśli więc chcesz dziedziczenia prototypowego, dobrym rozwiązaniem będzie funkcja konstruktora.Jeśli jednak chcesz dziedziczenia prototypowego, równie dobrze możesz użyć
Object.create
, co sprawia, że dziedziczenie jest bardziej oczywiste.Tworzenie literału obiektu (np:)
var obj = {foo: "bar"};
działa świetnie, jeśli masz wszystkie właściwości, które chcesz ustawić w czasie tworzenia.W przypadku późniejszego ustawiania właściwości
NewObject.property1
składnia jest ogólnie lepsza niż wNewObject['property1']
przypadku znajomości nazwy właściwości. Ale to drugie jest przydatne, gdy w rzeczywistości nie znasz nazwy właściwości z wyprzedzeniem (np .:)NewObject[someStringVar]
.Mam nadzieję że to pomoże!
źródło
Myślę, że to zależy od tego, czego chcesz. W przypadku prostych obiektów myślę, że można by użyć drugiej metody. Kiedy twoje obiekty rosną i planujesz użyć podobnych obiektów, myślę, że pierwsza metoda byłaby lepsza. W ten sposób możesz go również rozszerzyć za pomocą prototypów.
Przykład:
Nie jestem wielkim fanem trzeciej metody, ale jest ona bardzo przydatna na przykład do dynamicznej edycji właściwości
var foo='bar'; var bar = someObject[foo];
.źródło
Istnieje wiele sposobów tworzenia obiektów w JavaScript. Używanie funkcji konstruktora do tworzenia obiektu lub notacji literału obiektowego jest dużo używane w JavaScript. Tworząc instancję Object, a następnie dodając do niej właściwości i metody, istnieją trzy typowe sposoby tworzenia obiektów w JavaScript.
Funkcje konstruktora
Istnieją wbudowane funkcje konstruktora, z których wszyscy możemy korzystać od czasu do czasu, takie jak Date (), Number (), Boolean () itp., Wszystkie funkcje konstruktora zaczynają się od wielkiej litery, w międzyczasie możemy stworzyć niestandardową funkcję konstruktora w JavaScript lubię to:
i możesz go wywołać, po prostu używając new (), aby utworzyć nową instancję konstruktora, stworzyć coś takiego jak poniżej i wywołać funkcję konstruktora z wypełnionymi parametrami:
Literały obiektów
Używanie literałów obiektowych jest bardzo używanym przypadkiem tworzenia obiektu w JavaScript, to przykład tworzenia prostego obiektu, możesz przypisać wszystko do swoich właściwości obiektu, o ile są zdefiniowane:
Prototypowanie
Po utworzeniu obiektu możesz prototypować więcej członków, na przykład dodając kolor do naszego Boxa, możemy zrobić to:
źródło
Chociaż wiele osób twierdzi, że nie ma najlepszego sposobu tworzenia obiektów, istnieje uzasadnienie, dlaczego istnieje tak wiele sposobów tworzenia obiektów w JavaScript od 2019 r., A ma to związek z postępem JavaScript w różnych iteracjach wydań EcmaScript z 1997 roku.
Przed ECMAScript 5 istniały tylko dwa sposoby tworzenia obiektów: funkcja konstruktora lub notacja dosłowna (lepsza alternatywa dla new Object ()). Za pomocą notacji funkcji konstruktora tworzysz obiekt, którego instancję można utworzyć w wielu instancjach (za pomocą słowa kluczowego new), podczas gdy notacja literału dostarcza pojedynczy obiekt, taki jak singleton.
Niezależnie od zastosowanej metody obiekty JavaScript są po prostu właściwościami par klucz-wartość:
We wczesnych wersjach JavaScript jedynym prawdziwym sposobem naśladowania dziedziczenia opartego na klasach było użycie funkcji konstruktora. funkcja konstruktora jest specjalną funkcją wywoływaną za pomocą słowa kluczowego „new”. Zgodnie z konwencją identyfikator funkcji jest pisany wielkimi literami, ale nie jest to wymagane. Wewnątrz konstruktora odwołujemy się do słowa kluczowego „this”, aby dodać właściwości do obiektu, który funkcja konstruktora niejawnie tworzy. Funkcja konstruktora niejawnie zwraca nowy obiekt z wypełnionymi właściwościami z powrotem do funkcji wywołującej niejawnie, chyba że jawnie użyjesz słowa kluczowego return i zwrócisz coś innego.
Wystąpił problem z metodą sayName. Zazwyczaj w językach programowania opartych na klasach zorientowanych obiektowo używa się klas jako fabryk do tworzenia obiektów. Każdy obiekt będzie miał własne zmienne instancji, ale będzie miał wskaźnik do metod zdefiniowanych w schemacie klasy. Niestety, podczas korzystania z funkcji konstruktora JavaScript, za każdym razem, gdy jest ona wywoływana, definiuje nową właściwość sayName w nowo utworzonym obiekcie. Zatem każdy obiekt będzie miał swoją własną unikalną właściwość sayName. Spowoduje to zużycie większej ilości zasobów pamięci.
Oprócz zwiększonych zasobów pamięci, zdefiniowanie metod wewnątrz funkcji konstruktora eliminuje możliwość dziedziczenia. Ponownie, metoda zostanie zdefiniowana jako właściwość nowo utworzonego obiektu i żadnego innego obiektu, więc dziedziczenie nie może działać tak, jak. W związku z tym JavaScript zapewnia łańcuch prototypów jako formę dziedziczenia, czyniąc JavaScript językiem prototypowym.
Jeśli masz rodzica, a rodzic ma wiele wspólnych cech dziecka, to dziecko powinno odziedziczyć te właściwości. Przed ES5 było to realizowane w następujący sposób:
Sposób, w jaki wykorzystaliśmy powyższy łańcuch prototypów, jest dziwny. Ponieważ prototyp jest aktywnym łączem, zmieniając właściwość jednego obiektu w łańcuchu prototypów, zmieniasz również tę samą właściwość innego obiektu. Oczywiście zmiana odziedziczonej metody dziecka nie powinna zmienić metody rodzica. Object.create rozwiązało ten problem przy użyciu polyfill. Tak więc za pomocą Object.create można bezpiecznie modyfikować właściwość dziecka w łańcuchu prototypów bez wpływu na tę samą właściwość rodzica w łańcuchu prototypów.
ECMAScript 5 wprowadził Object.create, aby rozwiązać wyżej wymieniony błąd w funkcji konstruktora do tworzenia obiektów. Metoda Object.create () TWORZY nowy obiekt, używając istniejącego obiektu jako prototypu nowo utworzonego obiektu. Ponieważ tworzony jest nowy obiekt, nie występuje już problem polegający na tym, że modyfikacja właściwości potomnej w łańcuchu prototypów zmodyfikuje odniesienie rodzica do tej właściwości w łańcuchu.
Przed ES6 istniał wspólny wzorzec tworzenia wykorzystujący konstruktory funkcji i Object.create:
Obecnie Object.create w połączeniu z funkcjami konstruktora jest szeroko stosowany do tworzenia i dziedziczenia obiektów w JavaScript. Jednak ES6 wprowadził koncepcję klas, które są przede wszystkim cukrem syntaktycznym w stosunku do istniejącego dziedziczenia opartego na prototypach JavaScript. Składnia klas nie wprowadza do JavaScript nowego modelu dziedziczenia zorientowanego obiektowo. Zatem JavaScript pozostaje językiem prototypowym.
Klasy ES6 znacznie ułatwiają dziedziczenie. Nie musimy już ręcznie kopiować funkcji prototypowych klasy nadrzędnej i resetować konstruktora klasy potomnej.
Podsumowując, te 5 różnych strategii tworzenia obiektów w JavaScript zbiegło się z ewolucją standardu EcmaScript.
źródło
W powyższym przykładzie widać, że pusty obiekt w rzeczywistości ma właściwości.
Ok, najpierw zobaczmy, który sposób jest najlepszy:
W powyższym przykładzie dziennik zwróci wartość false.
Zobaczmy teraz, dlaczego inne sposoby tworzenia obiektów są nieprawidłowe.
Jak widać powyżej, wszystkie przykłady są rejestrowane jako prawda, co oznacza, że jeśli masz przypadek, że masz
for in
pętlę sprawdzającą, czy obiekt ma właściwość, prawdopodobnie doprowadzi Cię do błędnych wyników.Zauważ, że najlepszy sposób nie jest łatwy - musisz zdefiniować wszystkie właściwości obiektu wiersz po wierszu, inne sposoby są prostsze i będą wymagały mniej kodu do stworzenia obiektu, ale w niektórych przypadkach musisz być tego świadomy. Przy okazji zawsze używam „innych sposobów”, a jednym z rozwiązań powyższego ostrzeżenia, jeśli nie używasz najlepszego sposobu, jest:
źródło
Przede wszystkim istnieją 3 sposoby tworzenia obiektów -
Najprostszym jest użycie literałów obiektowych .
Chociaż ta metoda jest najprostsza, ale ma wadę, tj. Jeśli twój obiekt ma zachowanie (funkcje w nim), to w przyszłości, jeśli chcesz wprowadzić do niego jakiekolwiek zmiany, będziesz musiał to zmienić we wszystkich obiektach .
W takim przypadku lepiej jest użyć funkcji Factory lub Constructor. (Każdy, kogo lubisz)
Funkcje fabryki to te funkcje, które zwracają obiekt. Np.
Funkcje konstruktora to te funkcje, które przypisują właściwości do obiektów za pomocą słowa kluczowego „this”.
źródło