JavaScript Gardez le meilleur ! - Douglas Crockford
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
JavaScript Livre Page I Lundi, 15. décembre 2008 11:34 11 JavaScript Gardez le meilleur ! Douglas Crockford
JavaScript Livre Page 1 Lundi, 15. décembre 2008 11:34 11 Préface Si nous déplaisons, c’est avec intention.... De vous persuader... que nous venons, non pour déplaire, Mais bien avec intention... de montrer notre simple savoir-faire Voilà le vrai commencement de notre fin. – William Shakespeare, Le Songe d’une nuit d’été Ce livre traite du langage de programmation JavaScript. Il est destiné aux program- meurs qui, par hasard ou par curiosité, s’aventurent pour la première fois dans l’univers du JavaScript. Il est également destiné aux programmeurs qui ont déjà travaillé avec ce langage au niveau débutant et sont maintenant prêts à l’aborder de manière plus sophistiquée. Le JavaScript est un langage étonnamment puissant. Son originalité soulève un certain nombre de défis, mais par sa taille réduite, il s’avère facile à maîtriser. Mon but est ici de vous aider à apprendre à penser en JavaScript. Je vais vous présen- ter les composants du langage et vous amener à découvrir comment les combiner. Il ne s’agit pas d’un livre de référence. Il ne se donne pas pour tâche d’aborder le langage et ses excentricités de manière exhaustive. Vous trouverez aisément tout cela sur Internet. Ce livre se propose en revanche de n’inclure que ce qui compte vérita- blement. Cet ouvrage n’est pas destiné aux débutants. J’aurais sans doute plaisir un jour à écrire un livre sur les premiers pas en JavaScript, mais ce n’est pas l’objet du présent opus- cule. Il ne s’agit pas non plus d’un livre sur Ajax ou sur la programmation web. Son objet porte exclusivement sur le JavaScript, qui est l’un des multiples langages que le développeur web se doit de maîtriser. Ce n’est pas un livre d’introduction. Il n’est pas long, mais il est dense. Il contient un grand nombre d’informations. Ne vous découragez pas et n’hésitez pas à le relire plusieurs fois. Vos efforts en seront récompensés.
JavaScript Livre Page 2 Lundi, 15. décembre 2008 11:34 11 2 JavaScript : Gardez le meilleur ! Conventions utilisées dans ce livre Les conventions typographiques suivantes sont utilisées dans ce livre : Italique Signale les nouveaux termes, les URL, les noms de fichiers et les extensions de fichiers. Chasse fixe Signale le code de manière générale, comme les commandes, les options, les varia- bles, les attributs, les clés, les requêtes, les fonctions, les méthodes, les types, les classes, les modules, les propriétés, les paramètres, les valeurs, les objets, les événe- ments, les gestionnaires d’événements, les balises XML et XHTML, les macros et les mots-clés. Chasse fixe en gras Signale les commandes ou le texte qui doit être tapé littéralement par l’utilisateur. Utiliser les exemples de code Ce livre est là pour vous aider à réaliser votre travail. De manière générale, vous pouvez utiliser le code qu’il présente dans vos propres programmes et vos documentations. Vous n’avez pas à nous contacter pour en obtenir l’autorisation. Par exemple, l’écriture d’un programme qui utilise plusieurs blocs de code du livre ne requiert pas d’autorisa- tion. La vente ou la distribution d’un CD-ROM d’exemples requiert en revanche une autorisation. Veuillez dans ce cas prendre contact avec l’éditeur d’origine (O’Reilly) en mentionnant le titre original JavaScript: The Good Parts (ISBN: 978-0-596-51774-8). Le fait de répondre à une question en citant ce livre et en citant du code d’exemple ne requiert pas non plus d’autorisation. L’incorporation d’une grande quantité de code d’exemple de ce livre dans la documentation de votre produit requiert en revanche une autorisation. Les références au livre sont appréciées bien qu’elles ne soient pas obligatoires. Elles doivent généralement inclure le titre, l’auteur, l’éditeur et le numéro d’ISBN. Par exemple : Douglas Crockford, JavaScript : Gardez le meilleur !, Pearson, 2009, 978-2-7440-2328-6. Si vous pensez que l’usage que vous faites des exemples de code ne correspond pas aux cas évoqués ici, n’hésitez pas à contacter l’éditeur d’origine à permissions@oreilly.com.
JavaScript Livre Page 3 Lundi, 15. décembre 2008 11:34 11 Préface 3 Remerciements J’aimerais remercier les relecteurs qui ont signalé mes nombreuses bourdes évidentes. Il y a peu de choses que l’on puisse davantage apprécier dans la vie que d’avoir des gens intelligents qui vous font remarquer vos erreurs. C’est encore mieux quand ils le font avant que cela ne soit rendu public ! Merci donc à Steve Souders, Bill Scott, Julien Lecomte, Stoyan Stefanov, Eric Miraglia et Elliotte Rusty Harold. J’aimerais remercier les personnes avec lesquelles j’ai travaillé chez Electric Commu- nities et State Software et qui m’ont aidé à découvrir qu’au tréfonds du langage se cachait du bon, notamment Chip Morningstar, RandyFarmer, John La, Mark Miller, Scott Shattuck et Bill Edney. J’aimerais remercier Yahoo! Inc. pour m’avoir donné le temps de travailler sur ce projet et parce qu’il s’agit d’un excellent domaine de recherche. Merci à tous les membres de l’Ajax Strike Force, passés, présents et à venir. J’aimerais encore remercier O’Reilly Media, Inc. et notamment Mary Treseler, Simon Saint Laurent et Sumita Mukherji qui se sont assurés que tout se déroule sans accroc. Un merci tout particulier aussi au professeur Lisa Drake pour tout ce qu’elle fait. J’aimerais remercier par ailleurs l’équipe d’ECMA TC39 qui travaille d’arrache-pied pour améliorer le langage ECMAScript. Enfin, je remercie bien sûr Brendan Eich, le concepteur du langage de programmation le plus mal compris du monde, sans qui ce livre n’aurait pas eu sa raison d’être.
JavaScript Livre Page 4 Lundi, 15. décembre 2008 11:34 11
JavaScript Livre Page 5 Lundi, 15. décembre 2008 11:34 11 1 Les bons éléments ...sauf l’attrait de mes avantages personnels, je n’ai aucun charme. – William Shakespeare, Les Joyeuses Commères de Windsor Jeune programmeur, je mettais un point d’honneur à apprendre toutes les fonctionnalités des langages dont je me servais et je m’efforçais de les utiliser toutes lorsque je program- mais. Peut-être était-ce une manière d’en imposer, et je crois que si je travaillais tant, c’est justement parce que c’est à moi que l’on venait immédiatement s’adresser lorsque l’on cherchait à savoir comment utiliser une fonctionnalité particulière. Je me suis finalement rendu compte que certaines fonctionnalités posaient plus de problèmes qu’elles n’en résolvaient. Certaines étaient mal conçues et risquaient plus que d’autres de provoquer des complications pour la portabilité. Certaines généraient du code trop difficile à lire ou à modifier. Certaines m’amenaient à programmer d’une manière trop sophistiquée, avec des risques d’erreurs trop fréquents. Certaines de ces fonctionnalités étaient même des erreurs de conception. En effet, certains concepteurs de langage font eux-mêmes des erreurs. La plupart des langages de programmation contiennent de bons et de mauvais éléments. J’ai découvert que je pouvais devenir un meilleur programmeur en n’utilisant que les bons et en évitant les mauvais. Quoi de plus logique, car comment créer de bonnes choses avec de mauvais ingrédients ? Les commissions normatives ont rarement la possibilité de supprimer les imperfections d’un langage, car elles conduiraient ainsi à rendre inopérants tous les mauvais programmes qui s’appuient sur ces mauvais éléments. Elles n’ont généralement d’autre choix que d’empiler de nouvelles fonctionnalités par-dessus les anciennes imperfections existantes.
JavaScript Livre Page 6 Lundi, 15. décembre 2008 11:34 11 6 JavaScript : Gardez le meilleur ! Les nouvelles fonctionnalités n’interagissent d’ailleurs pas toujours de manière harmo- nieuse, ce qui produit alors de nouveaux mauvais éléments. Vous avez cependant vous-même la possibilité de définir votre propre sous-ensemble. Vous pouvez écrire de meilleurs programmes en ne vous appuyant que sur les bons éléments. Le JavaScript est un langage particulièrement bien servi en ce qui concerne les mauvais éléments. Il faut dire qu’il est passé de la non-existence à l’adoption universelle à une vitesse foudroyante. Pas une seconde pour faire un détour en laboratoire et y être testé et affiné. Il est passé directement dans Netscape Navigator 2 en l’état – autrement dit, à l’état brut. Lorsque les applets Java ont échoué, le JavaScript est devenu le "langage du Web" par défaut. La popularité du JavaScript est presque entièrement indépendante de ses qualités de langage de programmation. Mais le JavaScript contient heureusement un certain nombre d’éléments exception- nellement bons. Il couve en son sein un langage superbe, élégant et très expressif sous une pile de bourdes et de bonnes intentions. Ces qualités essentielles du JavaScript sont si efficacement cachées qu’on a longtemps pensé du langage qu’il s’apparentait à un jouet disgracieux et dépourvu d’intérêt. Ce que je me propose de faire ici, c’est de faire apparaître les qualités du JavaScript, cet exceptionnel langage de program- mation dynamique. Le JavaScript est comme un bloc de marbre : je me propose de le tailler pour en ôter les fonctionnalités hideuses et laisser apparaître sa vraie nature. J’estime que l’élégant sous-ensemble que j’ai ainsi isolé est considérablement supé- rieur au langage sous sa forme globale, car il est plus fiable, plus lisible et plus facile à gérer. Je ne tenterai pas dans ce livre de décrire le langage de manière exhaustive. Je me concentrerai plutôt sur les bons éléments en fournissant ici et là des avertissements concernant les mauvais. Le sous-ensemble que je vais décrire peut être utilisé pour construire des programmes fiables et lisibles de petite et de grande taille. En se concen- trant sur les bons éléments, il est possible de réduire le temps d’apprentissage, d’améliorer la robustesse des programmes et de sauver des arbres en gâchant moins de papier. L’un des principaux avantages liés au fait d’étudier les bons éléments tient à ce que vous éviterez ainsi d’avoir à désapprendre les mauvais. Il est généralement très difficile de se défaire de ses mauvaises habitudes. On y rechigne tous au plus haut point. Parfois, on décompose les langages en sous-ensembles pour mieux les faire assimiler aux étudiants. Dans le cas présent, je propose d’isoler un sous-ensemble du JavaScript afin qu’il fonctionne mieux pour les professionnels.
JavaScript Livre Page 7 Lundi, 15. décembre 2008 11:34 11 Chapitre 1 Les bons éléments 7 Pourquoi le JavaScript ? Le JavaScript est un langage important parce qu’il s’agit du langage des navigateurs web. Son association au navigateur en fait l’un des langages de programmation les plus populaires du monde. Pourtant, il est aussi l’un des langages les plus méprisés au monde. L’API du navigateur, le DOM (Document Object Model ou modèle objet de documents), est assez hideuse et le JavaScript est injustement décrié. Le DOM resterait ingérable avec n’importe quel langage. Sa spécification est pauvre et il est mal implé- menté. Ce livre n’aborde que très superficiellement le DOM. Écrire un livre sur le meilleur du DOM, voilà qui représenterait un vrai défi ! Le JavaScript est particulièrement décrié parce qu’il ne s’apparente à aucun autre langage. Si vous êtes aguerri avec un autre langage et que vous deviez programmer dans un environnement qui ne prend en charge que le JavaScript, cela peut être agaçant. La plupart des gens dans ce cas ne prennent pas même la peine de commen- cer par apprendre le JavaScript et découvrent avec surprise qu’il possède d’importan- tes différences avec le langage auquel ils aimeraient le voir ressembler et que ces différences sont loin d’être négligeables. L’incroyable concernant le JavaScript tient à ce qu’il reste souvent possible de réaliser les tâches souhaitées sans avoir véritablement à apprendre beaucoup du langage, et parfois même sans connaître grand-chose à la programmation. Il s’agit d’un langage extrêmement expressif. Il l’est d’autant plus lorsque vous savez ce que vous faites. La programmation est une opération difficile. Elle ne doit jamais être effectuée avec ignorance. Analyse du JavaScript Le JavaScript est bâti sur de très bonnes idées et quelques mauvaises. Les très bonnes comprennent les fonctions, le couplage lâche, les objets dynamiques et une notation littérale expressive des objets. Les mauvaises comprennent notamment un modèle de programmation axé sur les variables globales. Les fonctions JavaScript sont des objets de première classe avec une portée (le plus souvent) lexicale. Le JavaScript est le premier langage lambda à passer au domaine grand public. Au fond, le JavaScript a plus à voir avec Lisp et Scheme qu’avec Java. C’est une sorte de Lisp revêtu des habits du C. Cela fait du JavaScript un langage remarquablement puissant. La mode, avec la plupart des langages de programmation d’aujourd’hui, est celle du typage fort. La théorie veut que le typage fort permette au compilateur de détecter une grande catégorie d’erreurs à la compilation. Plus il est possible de détecter et réparer tôt
JavaScript Livre Page 8 Lundi, 15. décembre 2008 11:34 11 8 JavaScript : Gardez le meilleur ! les erreurs, moins elles se révèlent coûteuses. Le JavaScript est un langage faiblement typé, si bien que les compilateurs JavaScript ne sont pas capables de détecter les erreurs de type. Cette particularité peut inquiéter les programmeurs qui abordent le JavaScript après s’être forgé une expérience avec des langages à typage fort. Il se trouve cependant que le typage fort ne dispense pas d’avoir à effectuer des tests attentifs. En ce qui me concerne, j’ai en outre remarqué dans mon travail que le type d’erreur que la vérifica- tion de typage fort effectue ne concerne pas les erreurs qui m’inquiètent véritablement. À l’inverse, je trouve le typage faible plutôt libérateur. Il n’oblige pas à créer des hiérarchies de classes complexes. Il n’est jamais nécessaire non plus d’avoir à trans- typer des valeurs ou à se battre avec le système des types pour parvenir au comportement recherché. Le JavaScript possède une notation littérale d’objet très puissante. Les objets peuvent être créés en listant simplement leurs composants. Cette notation a inspiré JSON (JavaScript Object Notation), le format d’échange de données populaire (nous aborderons ce sujet à l’Annexe E). L’une des fonctionnalités controversées du JavaScript est l’héritage par prototype. Le JavaScript possède un système d’objets sans classe dans lequel les objets héritent des propriétés directement d’autres objets. Ce mécanisme est très efficace, mais il n’est pas habituel pour les programmeurs de formation classique. Si vous tentez d’appliquer des design patterns classiques directement au JavaScript, vous risquez d’être frustré. En revanche, si vous apprenez à travailler avec le mécanisme de prototypage JavaScript, vos efforts seront récompensés. Le JavaScript est très décrié pour ses choix conceptuels majeurs. Pour l’essentiel, ces choix ont cependant été bons, quoique inhabituels. L’un d’entre eux s’est cependant révélé particulièrement mauvais : le JavaScript dépend des variables globales pour la liaison. Toutes les variables de niveau supérieur de toutes les unités de compilations sont regroupées dans un espace de noms commun appelé objet global. C’est tout à fait inopportun, car les variables globales sont une plaie et, en JavaScript, elles sont fonda- mentales. Nous verrons heureusement que le JavaScript propose aussi les outils qui permettent de minimiser ce problème. Dans certains cas, il n’est pas possible d’ignorer les mauvais éléments. Il en existe quel- ques-uns d’épouvantables et d’impossibles à éviter, que nous signalerons le moment venu. L’Annexe A en dressera également la liste. Nous parviendrons cependant à éviter dans ce livre la plupart des mauvais éléments et récapitulerons ce qui a été laissé de côté à l’Annexe B. Si vous souhaitez en apprendre plus sur les mauvaises parties et sur la manière de mal les utiliser, courez lire un autre livre sur le JavaScript.
JavaScript Livre Page 9 Lundi, 15. décembre 2008 11:34 11 Chapitre 1 Les bons éléments 9 Le standard qui définit le JavaScript (aussi connu sous le nom de JScript) est la troisième édition du langage de programmation ECMAScript, qui est disponible à l’adresse http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf. Le langage décrit dans ce livre est un sous-ensemble approprié d’ECMAScript. Ce livre ne décrit pas le langage dans son ensemble, car il en exclut les mauvais éléments. Le parti pris n’est donc pas celui de l’exhaustivité. Il consiste à éviter les cas limites. Vous devriez en faire autant, pour votre sécurité. L’Annexe C décrit un outil de programmation appelé JSLint, un parseur JavaScript capable d’analyser un programme JavaScript et de signaler les mauvais éléments qu’il contient. JSLint fournit un certain niveau de rigueur qui fait généralement défaut dans le développement JavaScript. Il peut vous rassurer sur le fait que vos programmes ne contiennent que les bons éléments. Le JavaScript est un langage contrasté. Il contient quantité d’erreurs et de pièges, si bien qu’on peut être tenté de se demander : "Pourquoi l’utiliser ?" Deux réponses peuvent être données. La première est que vous n’avez pas le choix. Le Web est devenu une importante plate-forme pour le développement d’applications et le JavaScript est le seul langage qui se trouve dans tous les navigateurs. Il est bien malheureux que le Java ait échoué dans cet environnement ; s’il en avait été autrement, il existerait un choix pour ceux qui désirent utiliser un langage classique à typage fort. Mais Java a échoué et le JavaScript prospère, si bien qu’on est obligé d’admettre que le JavaScript n’a pas fait que des erreurs. L’autre réponse est que, en dépit de ses insuffisances, le JavaScript est très bon. Il est léger et expressif. Une fois que vous vous y habituerez, vous découvrirez que la programmation fonctionnelle peut devenir très amusante. Pour bien utiliser ce langage, vous devez cependant être précisément informé sur ses limitations. Je les martèlerai avec une certaine brutalité. Ne vous laissez pas décourager par cette rigueur. Les bons éléments sont suffisamment bons pour compenser les mauvais. Une installation simple pour les essais Si vous possédez un navigateur web et un éditeur de texte, vous disposez de tous les éléments nécessaires pour exécuter des programmes JavaScript. Pour commencer, créez un fichier HTML nommé program.html : Ensuite, créez un fichier dans le même répertoire nommé program.js : document.writeln(’Hello, world!’);
JavaScript Livre Page 10 Lundi, 15. décembre 2008 11:34 11 10 JavaScript : Gardez le meilleur ! Ensuite, ouvrez votre fichier HTML dans votre navigateur pour voir le résultat. Dans ce livre, une méthode method est utilisée pour définir les nouvelles méthodes. En voici la définition : Function.prototype.method = function (name, func) { this.prototype[name] = func; return this; }; Elle sera expliquée au Chapitre 4.
Vous pouvez aussi lire