Myślę, że ja też jestem metaforyczny i tajemniczy z poprzednią odpowiedzią. Następuje wyjaśnienie.
Instancja Array, Boolean, Date, Function, Number, RegExp, String to obiekt, ale wzbogacony o metody i właściwości specyficzne dla każdego typu. Na przykład tablica ma predefiniowaną length
właściwość, a obiekty ogólne nie.
javascript:alert([].length+'\n'+{}.length)
wyświetlacze
0
nieokreślony
W istocie interpreter FF Gecko rozróżnia również tablice i obiekty ogólne z wyraźnymi różnicami oceniającymi konstrukcje językowe.
javascript:
ra=[ "one", "two", "three"]; ra.a=4;
ob={0:"one", 1:"two", 2:"three"}; ob.a=4;
alert(
ra +"\n\n"+
ob +"\n\n"+
ra.toSource() +"\n\n"+
ra.a +"\t .toSource() forgot me! \n\n"+
ra.length +"\t and my length! \n\n"+
ob.toSource());
ps=""; for(i in ra)ps+=i+" "; alert(ps); /* NB .length is missing! */
ps=""; for(i in ob)ps+=i+" "; alert(ps);
wyświetlanie
raz Dwa Trzy
[obiekt Obiekt]
["raz Dwa Trzy"]
4 .toSource () zapomniał mnie!
3 i moja długość!
({0: "jeden", 1: "dwa", 2: "trzy", a: 4})
i 0 1 2 a
i 0 1 2 a
.
Odnośnie stwierdzenia, że wszystkie obiekty są funkcjami:
Nie jest ani składniowo, ani semantycznie poprawne użycie dowolnej instancji obiektu jako funkcji takiej jak 123()
lub "abc"()
lub []()
lub {}()
lub obj()
gdzie obj
jest dowolny typ inny niż Function
, więc dowolny obiekt INSTANCE nie jest Function
. Jednak biorąc pod uwagę obiekt obj
i jego typ jako Array, Boolean, Date, ...
, jak to się obj
stało Array, Boolean, Date, ...
? Co to jest Array, Boolean, Date, ...
?
javascript:
alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String] . join('\n\n') );
wyświetlacze
function Array() {
[native code]
}
function Boolean() {
[native code]
}
function Date() {
[native code]
}
function Function() {
[native code]
}
function Number() {
[native code]
}
function Object() {
[native code]
}
function RegExp() {
[native code]
}
function String() {
[native code]
}
W każdym przypadku, bez dwuznaczności, typ obiektu manifestuje się jako function
definicja, stąd stwierdzenie, że wszystkie obiekty są funkcjami! (To żart w tym, że celowo zasłoniłem i zamazałem rozróżnienie między instancją obiektu a jej typem! Jednak to pokazuje, że „nie możesz mieć jednego bez drugiego”, obiekt i funkcja! Wielkie litery podkreślają typ jako w przeciwieństwie do instancji.)
Wydaje się, że zarówno paradygmat funkcjonalny, jak i obiektowy mają fundamentalne znaczenie dla programowania i implementacji wbudowanych prymitywów niskiego poziomu interpretera JS, takich jak Math
i JSON
i true
.
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
wyświetlacze
[object Math]
[object JSON]
(new Boolean(true))
W czasie rozwoju Javascript, modny był obiektowy styl programowania (OOP - Object Oriented Programming style - „s” to moja własna gra słów!). . Funkcjonalne techniki programowania zostały zdegradowane do bardziej abstrakcyjnych i ezoterycznych egzaminów studiujących teorie automatów, funkcji rekurencyjnych, języków formalnych itp. I jako takie nie są tak smaczne. Jednak mocne strony tych formalnych rozważań są wyraźnie widoczne w Javascript, szczególnie w przypadku zaimplementowania w silniku FF Gecko (tj. .toSource()
).
Definicja obiektu dla funkcji jest szczególnie satysfakcjonująca, ponieważ jest zdefiniowana jako relacja powtarzania! zdefiniowane za pomocą własnej definicji!
function Function() { [native code] }
a ponieważ funkcja jest obiektem, ten sam sentyment dotyczy
function Object() { [native code] }
.
Większość innych definicji wygasa do statycznej wartości końcowej. Jednak eval()
jest szczególnie potężnym prymitywem, więc String może również osadzać dowolną funkcjonalność.
Zwróć uwagę, że język używany powyżej przesłania typ obiektu i rozróżnienie instancji.