Io penso, anch'io metaforico e criptico con la risposta precedente. Segue un chiarimento.
Un'istanza di Array, Boolean, Date, Function, Number, RegExp, String è un Object ma migliorato con metodi e proprietà specifici per ogni tipo. Ad esempio, un array ha una length
proprietà predefinita mentre gli oggetti generici no.
javascript:alert([].length+'\n'+{}.length)
visualizza
0
non definito
Intrinsecamente, l'interprete FF Gecko distingue anche tra array e oggetti generici con differenze distinte nella valutazione dei costrutti del linguaggio.
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);
visualizzazione
uno due tre
[oggetto Oggetto]
["uno due tre"]
4 .toSource () mi ha dimenticato!
3 e la mia lunghezza!
({0: "uno", 1: "due", 2: "tre", a: 4})
e 0 1 2 a
e 0 1 2 a
.
Per quanto riguarda l'affermazione che tutti gli oggetti sono funzioni:
Non è né sintatticamente né semanticamente corretto utilizzare un'istanza oggetto arbitrario come una funzione come 123()
o "abc"()
o []()
o {}()
o obj()
dove obj
è qualsiasi tipo diverso Function
, quindi un oggetto GRADO arbitrario non è Function
. Tuttavia, dato un oggetto obj
ed è tipo come Array, Boolean, Date, ...
, come è obj
venuto ad essere come un Array, Boolean, Date, ...
? Cos'è un Array, Boolean, Date, ...
?
javascript:
alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String] . join('\n\n') );
visualizza
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]
}
In ogni caso, senza equivoci, il tipo di oggetto si manifesta come una function
definizione, da qui l'affermazione che tutti gli oggetti sono funzioni! (L'ironia è che ho intenzionalmente oscurato e offuscato la distinzione di un'istanza di oggetto con quella del suo tipo! Tuttavia, questo mostra "non puoi averne uno senza l'altro", Oggetto e Funzione! Le maiuscole enfatizzano il tipo come opposto all'istanza.)
Sia un paradigma funzionale che uno a oggetti sembrano essere fondamentali per la programmazione e l'implementazione delle primitive incorporate di basso livello dell'interprete JS, come Math
e JSON
e true
.
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
visualizza
[object Math]
[object JSON]
(new Boolean(true))
Al tempo dello sviluppo di Javascript, uno stile di programmazione incentrato sugli oggetti (OOP - stile di programmazione orientata agli oggetti - la "s" è il mio gioco di parole!) Era in voga e l'interprete veniva battezzato allo stesso modo con Java per dargli maggiore credibilità . Le tecniche di programmazione funzionale furono relegate a esami più astratti ed esoterici studiando le teorie degli automi, delle funzioni ricorsive, dei linguaggi formali, ecc. E come tali non appetibili. Tuttavia, i punti di forza di queste considerazioni formali sono chiaramente evidenti in Javascript, in particolare come implementato nel motore Gecko di FF (cioè .toSource()
).
La definizione di Oggetto per Funzione è particolarmente soddisfacente poiché è definita come una relazione di ricorrenza! definito usando la sua definizione!
function Function() { [native code] }
e poiché una funzione è un oggetto vale lo stesso sentimento
function Object() { [native code] }
.
La maggior parte delle altre definizioni si interrompe su un valore terminale statico. Tuttavia, eval()
è una primitiva particolarmente potente e quindi una String può anche incorporare funzionalità arbitrarie.
Notare ancora una volta che il vernacolo usato sopra oscura il tipo di oggetto e la distinzione tra istanze.