Je pense, moi trop métaphorique et cryptique avec la réponse précédente. Une clarification suit.
Une instance de Array, Boolean, Date, Function, Number, RegExp, String est un objet mais amélioré avec des méthodes et des propriétés spécifiques à chaque type. Par exemple, un tableau a une length
propriété prédéfinie alors que les objets génériques n'en ont pas.
javascript:alert([].length+'\n'+{}.length)
affiche
0
indéfini
Intrinsèquement, l'interpréteur FF Gecko fait également la distinction entre les tableaux et les objets génériques avec des différences distinctes évaluant les constructions de langage.
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);
affichage
un deux trois
[objet Objet]
["un deux trois"]
4 .toSource () m'a oublié!
3 et ma longueur!
({0: "un", 1: "deux", 2: "trois", a: 4})
et 0 1 2 a
et 0 1 2 a
.
Concernant l'affirmation selon laquelle tous les objets sont des fonctions:
Il n'est ni syntaxiquement ni sémantiquement correct d'utiliser une instance d'objet arbitraire comme une fonction comme 123()
ou "abc"()
ou []()
ou {}()
ou obj()
où obj
est un type autre que Function
, donc un objet arbitraire INSTANCE n'est pas a Function
. Cependant, étant donné un objet obj
et son type comme Array, Boolean, Date, ...
, comment est-il obj
arrivé à être en tant que Array, Boolean, Date, ...
? Qu'est-ce qu'un Array, Boolean, Date, ...
?
javascript:
alert([Array, Boolean, Date, Function,
Number, Object, RegExp, String] . join('\n\n') );
affiche
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]
}
Dans tous les cas, sans équivoque, le type d'objet se manifeste comme une function
définition, d'où l'affirmation que tous les objets sont des fonctions! (La ironie est que j'ai intentionnellement obscurci et brouillé la distinction d'une instance d'objet avec celle de son type! Pourtant, cela montre "vous ne pouvez pas avoir l'un sans l'autre", Objet et fonction! La capitalisation met l'accent sur le type comme opposé à l'instance.)
Un paradigme fonctionnel et un paradigme d'objet semblent être fondamentaux pour la programmation et la mise en œuvre des primitives intégrées de bas niveau de l'interpréteur JS, telles que Math
et JSON
et true
.
javascript:alert([Math, JSON, true.toSource()].join("\n\n"));
affiche
[object Math]
[object JSON]
(new Boolean(true))
Au moment du développement de Javascript, un style de programmation orienté objet (POO - Object Oriented Programming style - le "s" est mon propre jeu de mots!) Était en vogue et l'interpréteur a été baptisé de la même manière avec Java pour lui donner une plus grande crédibilité . Les techniques de programmation fonctionnelle ont été reléguées à des examens plus abstraits et ésotériques étudiant les théories des automates, des fonctions récursives, des langages formels, etc. et, en tant que telles, ne sont pas acceptables. Cependant, les points forts de ces considérations formelles sont clairement manifestes dans Javascript, en particulier tel qu'implémenté dans le moteur Gecko de FF (ie. .toSource()
).
La définition d'objet pour Function est particulièrement satisfaisante car elle est définie comme une relation de récurrence! défini en utilisant sa propre définition!
function Function() { [native code] }
et comme une fonction est un objet, le même sentiment vaut
function Object() { [native code] }
.
La plupart des autres définitions sont suspendues à une valeur terminale statique. Cependant, eval()
est une primitive particulièrement puissante et donc une chaîne peut également intégrer des fonctionnalités arbitraires.
Notez encore une fois, le vernaculaire utilisé ci-dessus obscurcit le type d'objet et la distinction d'instance.