Jaka jest różnica między new Object () a literałem obiektu notacji?
Jaka jest różnica między tą opartą na konstruktorze składnią tworzenia obiektu:
person = new Object()
...
i ta dosłowna składnia:
person = {
property1 : "Hello"
};
Wygląda na to, że oba robią to samo, chociaż JSLint woli używać notacji literału obiektowego.
Który jest lepszy i dlaczego?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
11 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Jednak istnieje duża różnica, gdy zaczynasz dodawać metody do obiektu.
Dosłownie:
Prototypowy sposób:
Oba sposoby pozwalają na tworzenie instancji w następujący sposób:
Jednak w przypadku metody dosłownej przesyłasz kopię metody do każdej instancji swoich obiektów. Natomiast w przypadku metody prototypowej metoda jest zdefiniowana w prototypie obiektu i współdzielona przez wszystkie instancje obiektu.
Jeśli masz wiele obiektów lub metod, dosłowny sposób może doprowadzić do znacznej utraty pamięci.
Anonimowy użytkownik
Potwierdzenie od:
i
dodaje do niego właściwość. Ale notacja dosłowna zajmuje mniej miejsca w kodzie źródłowym. Wyraźnie rozpoznaje, co się dzieje, więc używając naprawdę piszesz więcej i (w teorii, jeśli nie jest zoptymalizowane przez silnik JavaScript) wykonujesz niepotrzebne wywołanie funkcji.
Te
technicznie nie rób tego samego. Pierwsza po prostu tworzy obiekt. Drugi tworzy go i przypisuje właściwość. Aby pierwsza była taka sama, musisz wykonać drugi krok, aby utworzyć i przypisać właściwość.
„Coś niezwykłego”, co ktoś mógłby zrobić, byłoby cieniem lub domyślnym przypisaniem globalnego elementu :
W tym
niezwykle niezwykłe
w przypadku, gdy nie powiedzie się, ale będzie działać.
W praktyce nigdy nie ma powodu, aby używać zamiast (chyba że zrobiłeś to bardzo niezwykłe).
Anonimowy użytkownik
Potwierdzenie od:
Nie znalazłem nic, co wskazywałoby na to, że istnieje jakaś znacząca różnica między tymi dwoma, jeśli chodzi o ich działanie za kulisami (proszę mnie poprawić, jeśli się mylę - chciałbym wiedzieć). Jednak druga metoda (wykorzystująca notację literału obiektowego) ma kilka zalet.
Rozważ nowy obiekt zawierający nazwę elementu i TelNo. Korzystając z nowej konwencji Object (), możemy to utworzyć w następujący sposób:
Funkcjonować
Expando Properties
http://it.toolbox.com/blogs/th ... 18471
JavaScript pozwala nam w ten sposób na bieżąco tworzyć nowych członków i osiągamy to, co zamierzaliśmy. Jednak ta metoda nie jest zbyt zorganizowana ani zamknięta. A co, jeśli chcemy określić członków podczas tworzenia, bez polegania na właściwościach expando i przypisaniu po utworzeniu?
W tym miejscu może pomóc notacja dosłowna obiektu:
Tutaj uzyskaliśmy ten sam efekt w jednej linii kodu i przy znacznie mniejszej liczbie znaków.
Dalsze omówienie powyższych metod budowy obiektów można znaleźć pod adresem:
JavaScript i programowanie obiektowe (OOP).
http://www.javascriptkit.com/j ... shtml
Wreszcie, co z tym idiotą, który przebiegł przez placówkę? Czy naprawdę myślisz, że to niemożliwe? Dobrze,
to JSFiddle
http://jsfiddle.net/Pdsr2/
dowodzi, że jest inaczej. Używanie notacji literalnej obiektu zapobiega wpadnięciu w błoto tej klaunowskiej gry.
(Od
http://www.jameswiseman.com/bl ... ation
http://www.jameswiseman.com/bl ... tion/
/)
Anonimowy użytkownik
Potwierdzenie od:
Zauważ, że jest to rozszerzenie tego, co tutaj:
dlaczego arr = [] jest szybszy niż arr = new Array?
https://coderoad.ru/7375120/
mój wynik był następujący:
więc oczywiście {} i [] są szybsze niż używanie new do tworzenia pustych obiektów/tablic.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od:
oparty na konstruktorze
„using the operator”
new
". To jest to samo, co tworzenie obiektu przy użyciu składni"
object literal
". Ale"
projekt
„obiekty utworzone za pomocą operatora”
new
„są niezwykle pomocne, gdy myślisz o”
dziedziczenie prototypowe
". Nie można zachować łańcucha dziedziczenia z obiektami utworzonymi przy użyciu składni literału. Ale można tworzyć
funkcja konstruktora
, dołącz właściwości i metody do swojego prototypu. Następnie, jeśli przypiszesz tę funkcję konstruktora do dowolnej zmiennej za pomocą „
new
”, zwróci obiekt, który będzie miał dostęp do wszystkich metod i właściwości dołączonych do prototypu tej funkcji konstruktora.
Oto przykład tworzenia obiektu przy użyciu funkcji konstruktora (zobacz wyjaśnienie kodu poniżej):
Teraz możesz utworzyć dowolną liczbę obiektów, tworząc instancję funkcji konstrukcji Person, a wszystkie one odziedziczą po niej fullname ().
Uwaga:
słowo kluczowe "
this
"będzie odnosić się do pustego obiektu w funkcji konstruktora i za każdym razem, gdy utworzysz nowy obiekt z człowieka za pomocą"
new
", automatycznie zwraca obiekt zawierający wszystkie właściwości i metody skojarzone ze słowem kluczowym"
this
". I te obiekty najprawdopodobniej odziedziczą metody i właściwości związane z
prototyp
Funkcje konstruktora Person (co jest główną zaletą tego podejścia).
Nawiasem mówiąc, jeśli chcesz uzyskać tę samą funkcjonalność ze składnią „
object literal
", będziesz musiał utworzyć pełną nazwę () na wszystkich obiektach, jak pokazano poniżej:
Wreszcie, jeśli teraz zapytasz, dlaczego powinienem stosować to podejście
funkcje konstruktora
zamiast podejścia
dosłowny obiekt
:
*** Dziedziczenie prototypowe umożliwia utworzenie prostego łańcucha dziedziczenia, który może być niezwykle użyteczny i potężny.
*** Oszczędza pamięć, dziedzicząc wspólne metody i właściwości zdefiniowane w prototypie funkcji konstruktora. W przeciwnym razie będziesz musiał kopiować je w kółko we wszystkich obiektach.
Mam nadzieję, że to ma sens.
Anonimowy użytkownik
Potwierdzenie od:
Innym powodem używania literałów w przeciwieństwie do konstruktora obiektów jest brak rozdzielczości zakresu. Ponieważ jest możliwe, że utworzyłeś konstruktora lokalnego o tej samej nazwie, interpreter musi przeszukiwać łańcuch o określonym zakresie, z którego wywołano Object (), aż znajdzie globalny konstruktor obiektów.
Anonimowy użytkownik
Potwierdzenie od:
Dzieje się tak, ponieważ kompilator jest zdezorientowany co do nawiasów i uważa, że to konstrukcja
label: statement
https://developer.mozilla.org/ ... label
; średnik jest opcjonalny, więc nie narzeka na to.
Jeśli dodasz inną właściwość do obiektu, w końcu zwróci to błąd.
Anonimowy użytkownik
Potwierdzenie od:
Zaktualizuj 2019
Uruchomiłem ten sam kod co @rjloura na moim węźle OSX High Sierra 10.13.6 w wersji 10.13.0 i oto wyniki
Anonimowy użytkownik
Potwierdzenie od:
ponieważ poniższy kod jest nieprawidłowy:
Anonimowy użytkownik
Potwierdzenie od: