5.6 Les fonctions sont des objets

Concept déroutant mais fondamental en JavaScript : les fonctions sont des objets. Une déclaration de fonction crée en réalité un objet d'un type particulier, avec ses propres propriétés et méthodes. Cela ouvre des possibilités très puissantes.

Propriétés visibles

Si vous tapez Circle. dans l'IDE, l'auto-complétion révèle une liste de membres. Circle.name contient le nom de la fonction (« Circle »), Circle.length renvoie le nombre de paramètres déclarés. Plus intéressant encore : Circle.constructor pointe vers une fonction interne nommée Function, qui est le constructeur intégré utilisé par le moteur pour créer toutes les fonctions.

function Circle(radius) {
							  this.radius = radius;
							}
							
							console.log(Circle.name);   // 'Circle'
							console.log(Circle.length); // 1

Créer une fonction via new Function

Puisque toute fonction est un objet créé par Function, on peut en théorie créer une fonction dynamiquement en appelant ce constructeur directement. On passe les noms de paramètres en chaînes, puis le corps de la fonction en dernier argument. C'est rarement utile en pratique mais montre bien la nature objet des fonctions.

Les méthodes call et apply

Toutes les fonctions exposent les méthodes call et apply. Elles permettent d'invoquer la fonction en choisissant explicitement la valeur de this. Le premier argument fixe this, les suivants sont les arguments effectifs.

Circle.call({}, 1);          // équivalent à new Circle(1) en termes de this
							Circle.apply({}, [1]);       // pareil, mais les args sont dans un tableau

La différence entre call et apply est minime : call prend les arguments un par un, apply les prend sous forme de tableau. apply est très utile quand vous avez déjà un tableau d'arguments à passer. Ces méthodes vous serviront beaucoup pour des techniques avancées comme le partage de méthodes entre objets non liés ou la composition de fonctions.