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.
En résumé
Cette leçon explique que les fonctions en JavaScript sont des objets à part entière, possédant des propriétés (name, length) et des méthodes (call, apply, bind). Elle démontre comment les fonctions sont créées en interne via le constructeur Function, et comment utiliser les méthodes call() et apply() pour contrôler explicitement le contexte 'this' lors de l'exécution.
Points clés
- Les fonctions sont des objets avec des propriétés accessibles (name, length) et des méthodes (call, apply, bind)
- Toute fonction possède une propriété constructeur qui référence le constructeur Function
- Les fonctions peuvent être créées dynamiquement avec new Function(paramètres, code)
- La méthode call() permet d'appeler une fonction en spécifiant le contexte 'this' et les arguments explicitement
- La méthode apply() fonctionne comme call() mais accepte les arguments sous forme de tableau
- L'opérateur new crée un objet vide et le transmet au constructeur comme valeur de 'this'
Questions fréquentes
Qu'est-ce que cela signifie que les fonctions sont des objets en JavaScript ?
Cela signifie que les fonctions possèdent des propriétés (comme name et length) et des méthodes (comme call et apply), tout comme les objets réguliers. En interne, JavaScript les crée avec le constructeur Function, ce qui en fait des objets de première classe.
Quelle est la différence entre les méthodes call() et apply() ?
Les deux méthodes permettent d'appeler une fonction avec un contexte 'this' spécifique. La différence est que call() accepte les arguments explicitement en paramètres séparés, tandis que apply() les accepte sous forme de tableau.
À quoi sert l'opérateur new quand on l'utilise avec une fonction ?
L'opérateur new crée un nouvel objet vide et le transmet à la fonction comme valeur de 'this'. Cela permet aux fonctions de fonctionner comme des constructeurs pour créer de nouvelles instances d'objets.