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ą lengthwł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 ai 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 objjest dowolny typ inny niż Function, więc dowolny obiekt INSTANCE nie jest Function. Jednak biorąc pod uwagę obiekt obji jego typ jako Array, Boolean, Date, ..., jak to się objstał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 functiondefinicja, 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 Mathi JSONi 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.