Nie żartuję sobie z żartu, naprawdę pytam.W jaki sposób łańcuch JavaScript nie jest obiektem?
Douglas Crockford is fond of saying że w języku prototypowym obiektowo zorientowanym javascript nie ma potrzeby, aby new
.
Wyjaśnia, że new
po prostu dodaje do osób pochodzących z (czyli „klasycznych”) obiektowych języków programowania opartych na klasach pewien poziom komfortu:
JavaScript, We Hardly
new
YaJavaScript jest prototypowy język, ale ma operatora
new
, który stara się, aby wyglądał jak klasyczny język. To często wprowadza w błąd programistów, prowadząc do pewnych problematycznych wzorców programowania.Nigdy nie musisz używać
new Object()
w JavaScript. Zamiast tego użyj obiektu literalnego{}
.
Dobra, w porządku:
new
złe{}
dobry
Ale potem komentator Vítor De Araújo pointed out that the two are not the same. Podaje przykład pokazujący, że string
nie jest jak object
:
obiektu String i wartość ciągu nie jest to samo:
js> p = "Foo" Foo js> p.weight = 42 42 js> p.weight // Returns undefined js> q = new String("Foo") Foo js> q.weight = 42 42 js> q.weight 42
Wartość ciągu nie można mieć nowe właściwości. To samo dotyczy innych typów.
Co się tutaj dzieje, że string
nie jest object
? Czy mylić javascript z innymi językami, gdzie wszystko jest przedmiotem?
... a ja nie zupełnie zgadza się z Crockforda: to nie jest konieczne jest użycie "nowego obiektu" (ani "nowa tablica", zamiast tego użyj '[]', ale jeśli chcesz zdefiniować nowe wystąpienie (pre) zdefiniowanej klasy, powinieneś użyć operatora 'new', jak w 'new Date()' lub 'new SchrodingersCat()'. –
@Marcel Korpel: * "należy użyć" * lub ** musi ** * użyć *? Czy istnieje inny sposób skonstruowania nowego obiektu z prototypu obiektu "Date"? –
Dobre pytanie, w przypadku "Date": ** must **. Jeśli wywołasz "Date" jako funkcję bare, zwraca ona bieżącą datę i czas jako ciąg znaków. Zobacz także [Używanie konstruktora bez operatora 'new'] (http://stackoverflow.com/questions/1928342/using-constructor-without-operator-new) i [Czy nowy operator JavaScript robi cokolwiek, ale utrudnia życie?] (Http : //stackoverflow.com/questions/1744426/does-javascripts-new-operator-do-anything-but-make-life-difficult) –