JAVASCRIPT
Transcription
JAVASCRIPT
JAVASCRIPT TELECOM PARISTECH Slides préparés par Jean-Claude Dufourd et Cyril Concolato. 0 JAVASCRIPT Ŷ Historique Ŷ Bases • Syntaxe de base, variables, fonctions, expressions, boucles, conditions Ŷ Programmation « avancée » • Object, Array et autres objets globaux • Function, arguments, call, apply, map Ŷ Particularités importantes: • closure,… Ŷ Programmation Orientée Objet: • constructeur, héritage, surcharge,… Ŷ Environnements (navigateur, node.js, JSON) HISTORIQUE Ŷ Langage de programmation créé par Brendan Eich, Netscape, en 1994/1995 • En quelques semaines • Au plus fort de la bataille avec Microsoft ("browsers war", JScript) • D'abord nommé Mocha, puis LiveScript, puis JavaScript, • Appelé JavaScript pour apaiser une dispute avec Sun, en référence au langage Java - Mais très différent de Java: ne pas confondre! Ŷ Standardisé sous le nom ECMA-262, ECMAScript… • 1ère version (1997) • 3e édition (1999) • 5e édition - ES5 (2009) • 6e édition - ES6 (2015) • 7e édition - en cours PARTICULARITÉS DU LANGAGE Ŷ Langage interprété (côté client) Ŷ Inspiré des langages Scheme et Self (et Java pour la syntaxe) Ŷ Très puissant, mais avec des erreurs de jeunesse dignes d'une béta Ŷ Vidéos: The Good Parts par Douglas Crockford SYNTAXE DE BASE Ŷ Syntaxe inspirée du C, du Java • Utilisation de {} pour séparer les blocs de code • Utilisation de () pour les fonctions, les if, ... • Commentaires - Sur une ligne avec ŵŵ - Sur plusieurs ligne avec ŵƋƋŵ • Sensibilité à la casse: une variable est différente de Ŷ Quelques particularités: • L'utilisation de ; après chaque expression n'est pas obligatoire, mais fortement conseillé! ʰ ɪ Ŝſƀ équivalent à ʰɪŚ ŜſƀŚ LES BASES PAR L’EXEMPLE: LES VARIABLES Ŷ déclarer une variable Ś • On ne déclare pas le type d'une variable • La valeur initiale, par défaut est la valeur spéciale: Ŷ déclarer et assigner une valeur à une variable ʰɥŚ Ŷ Les valeurs ont un type parmi: , , , , , ou alors • vérifiable avec: Ŷ Le type d'une variable peut changer au cours du temps: ʰɥŚŚŵŵŞʴɑɑ ʰŞɥŜɥɨŚŚŵŵ²Şʴɑɑ ʰɑɑŚŚŵŵ Ä ±Şʴɑɑ ʰɐ ŠɐŚŚŵŵ Ä ±Şʴɑɑ ʰŚŚŵŵ²Şʴɑɑ ʰŚŚŵŵŞʴɑ ɑ ʰŚŚŵŵ²Şʴɑɑ ʰŚŚŵŵŞŞŞʴɑɑ LES BASES PAR L’EXEMPLE: LES TABLEAUX Ŷ Déclarer un tableau: ʰƃɩřɪřɬřɮƄŚ Ŷ Accéder à une entrée du tableau: ƃɥƄŚŵŵͥɩ ŜŚŵŵͥɫ ƃŜŷɨƄŚŵŵͥɮ ƃɑɩɑƄŚŵŵͥɬ ŜɩŚŵŵͥś Ŷ Un tableau est dynamique, et peut contenir n'importe quoi: ʰƃƄŚŵŵ ƃɥƄʰɑɑŚŵŵɐ²ɥ² ² ƃɨƄʰŚŵŵ ² ƃɩƄʰƇƈŚ ƃɪƄʰŚ ƃɫƄʰŚ ƃɬƄʰƃƄŚ ƃɨɯƄʰɩŚŵŵɬɨɯ LES BASES PAR L’EXEMPLE: LES OBJETS Ŷ Un objet est un ensemble de propriétés, c'est-à-dire de couples (nom, valeur) Ŷ Déclarer un objet (object literal expression): ʰƇ śɑ ɑř śř ɑɑśɨŵŵ ś²ŠŠŠ ƈŚ Ŷ Accéder à une propriété de l'objet: Ŝ Śŵŵͥɑ ɑř² ƃɑɑƄŚŵŵͥř²² Ŷ On peut assigner une propriété à tout moment: Ŝʰɑ ɑŚŵŵ²²ɐɐ Ŝ ʰƇƈŚŵŵ²²ɐ ɐ ƃɑɑƄʰɑ ɑŚŵŵ²²ɐɐ ƃɑ ɑƄʰɑɑŚŵŵ²² LES BASES PAR L’EXEMPLE: TABLEAUX ET OBJETS ʰƃƄŚŵŵ ŜŚŵŵͥɥ ʰƃŵŵɐ Ƈśɥřśɨƈř Ƈśɨřśɨƈř Ƈśɨřśɨřśɩƈ ƄŚ ʰƇŵŵ ɨśƇśɥřśɨƈř ɩśƇśɨřśɨƈ ƈŚ ʰƇ ɨśƃƃɨřɩƄřƃɪřɫƄƄřŵŵɌ ɩśƃƃɨřɩƄřƃɫřɭƄƄ ƈŚ LES BASES PAR L’EXEMPLE: ARITHMÉTIQUE ɪʫɩŚŵŵͥɬ ɪƋɩŚŵŵͥɭ ɪŷɩŚŵŵͥɨ ɪŵɩŚŵŵͥɨŜɬ ɪʩɩŚŵŵͥɨŵŵ ɑɪɑʫɑɩɑŚŵŵͥɑɪɩɑŵŵ ² ɑɪɑŞɑɩɑŚŵŵͥɨŵŵ ʰɥŚ ʫʫŚ ŞŞŚ ʫʫ Ś ŞŞ Ś ʫʰɩŚ ŞʰɫŚ ƋʰɬŚ ʫɑɩɨɑŚŵŵͥɩɨŵŵ ɑɩɨɑɩɨ ʫɑɩɨɑŚŵŵͥŵŵ ſɑɩɨɑƀŚŵŵͥɩɨŵŵ ɑɩɨɑɩɨ ſɑɩɨɑƀŚŵŵͥɩɨŵŵ ² ſɑɩɨŜɬɑƀŚŵŵͥɩɨŜɬŵŵ ² LES BASES PAR L’EXEMPLE: (IN-)ÉGALITÉS ʰɪřʰɩŚ ʰʰŵŵͥ Šʰŵŵͥ ʳŵŵͥ ʴʰŵŵͥ ɑɑʰʰɑɑŵŵͥ ɑɑʴɑɑŵŵͥſ ƀ ʰʰſʳƀŵŵͥ ſʰʰɩƀĺĺſʰʰɪƀŵŵͥ ſʰʰɩƀŶŶſʰʰɫƀŵŵͥ Šſʰʰƀŵŵͥ LES BASES PAR L’EXEMPLE: TESTS ET IF ſʰʰɥƀʰɫŚ ſʰʰɥƀƇʰɫŚƈ ſʰʰɥƀƇʰɫŚʰɩŚƈ ſʰʰɥƀƇ ʰɫŚ ʰɩŚ ƈ ſʰʰɥƀƇ ʰɫŚ ʰɩŚ ƈƇ ʰŞɫŚ ƈ ſʰʰɥƀƇ ʰɫŚ ʰɩŚ ƈſʰʰɨƀƇ ʰŞɫŚ ƈ ATTENTION AUX TESTS D'ÉGALITÉ Ŷ ʰʰ (resp. Šʰ) teste l’égalité (resp. la non-égalité) après d’éventuels changements de type ɩʰʰɩŵŵͥ ɑɩɑʰʰɩŵŵͥŠŠŠ ɑɩɑŠʰɩŵŵͥŠŠŠ Ŷ ʰʰʰ (resp. Šʰʰ) teste l'égalité (resp. la non-égalité) stricte sur les types d’origine ɑɩɑʰʰʰɩŵŵͥ ɑɩɑŠʰʰɩŵŵͥ Utiliser cette syntaxe le plus souvent possible Ŷ inégalité et conversion ɑɩɩɑʴɑɪɑŵŵͥ ʫɑɩɩɑʴɑɪɑŵŵͥ TABLEAUX D'ÉGALITÉS ATTENTION AUX TESTS SANS ÉGALITÉ Ŷ Les tests suivants sont évalués à (ce sont les seuls 6 cas) et donc le code dans la boucle ne s'exécute pas ſƀƇŜŜŜƈ ſɥƀƇŜŜŜƈ ſɑɑƀƇŜŜŜƈ ſƀƇŜŜŜƈ ſƀƇŜŜŜƈ ſƀƇŜŜŜƈƀ Ŷ Tout le reste s'évalue à et donc le code dans la boucle s'exécute ſƀƇŜŜŜƈ ſɨƀƇŜŜŜƈ ſŞɨƀƇŜŜŜƈ ſɑɑƀƇŜŜŜƈ ſɑɑƀƇŜŜŜƈ ſɑɨɑƀƇŜŜŜƈ ſɑɥɑƀƇŜŜŜƈ ſ ƀƇŜŜŜƈ ſƃƄƀƇŜŜŜƈ ſƇƈƀƇŜŜŜƈ ſƃɥƄƀƇŜŜŜƈ ſƃɨƄƀƇŜŜŜƈ LES BASES PAR L’EXEMPLE: BOUCLES ſŜŜŜƀƇ ŜŜŜ ƈ Ƈ ŜŜŜ ƈſŜŜŜƀŚ Ś ſʰɥŚʳɨɥŚʫʫƀƇ ŜŜŜ ƈ ŵŵ² ɐ² ſʰɥŚʳɨɥŚʫʫƀƇ ŜŜŜ ƈ ŵŵ²²²²ɐ ſƀƇ ŜŜŜ ƈ LES BASES PAR L’EXEMPLE: SWITCH ŵŵɐ² ſƀƇ ɑɑśŵŵ ŜŜŜ Ś ɨśŵŵ ŜŜŜ Ś ś ŜŜŜ ƈ LES FONCTIONS FONCTIONS ET ARGUMENTS Ŷ Les arguments sont séparés par des virgules, et utilisés dans l'ordre Ŷ Les arguments non spécifiés ont la valeur Ŷ On peut accéder aux arguments via le tableau ſřƀƇ ŜſɑśɑʫʫɑřśɑʫʫɑřśɑʫƃɩƄƀŚ ƈ ſɨřɩřɪƀŚŵŵśɨřśɩřśɪ ſɨřɩƀŚŵŵśɨřśɩřś ſɨƀŚŵŵśɨřśřś PORTÉE DES VARIABLES Ŷ en Java ou en C, les variables ont une portée bloc Ŷ en JS une portée fonction (sauf en utilisant le mot clé ES6 ) ſƀƇ ʰɥŚ ſŠʰʰƀƇ ʰɥŚ ſʰɥŚʳɨɥŚʫʫƀƇ ŜſřƀŚ ƈ ŜſƀŚŵŵ ƈ ŜſƀŚŵŵ ƈ VARIABLES ET PILE D'APPELS Ŷ Comment déterminer quelle variable utiliser quand plusieurs variables locales à des fonctions imbriquées ont le même nom? ʰɥŚŵŵ ſ ſƀƇ ʰɨřʰɐ ɨɐŚ ſ ƀŚ ſ ſƀƇ ʰɩřʰɐ ɩɐŚ ſ ƀŚ ſ ſƀƇ ʰɪřʰɐ ɪɐŚ ſ ƀŚ ſʫʫƀŚ ƈſƀƀŚ ƈſƀƀŚ ƈſƀƀŚ Ŷ Dans la pile d'appels, la variable utilisée est cherchée: • dans la fonction courante • dans la fonction appelante (en remontant) • dans le code en dehors des fonctions VARIABLE NON-DÉCLARÉE Ŷ Une variable non déclarée est automatiquement déclarée avec comme portée la fonction englobante (sauf si une variable de portée plus globale existe) ſƀƇ ʰɥŚ ƈ équivalent à: ſƀƇ Ś ʰɥŚ ƈ mais la variable n'est pas assignée ſƀƇ ŜſƀŚŵŵͥ ʰɥŚ ŜſƀŚŵŵͥɥ ƈ PORTÉE DES FONCTIONS Ŷ une déclaration de fonction est une déclaration de variable de type "function" ſƀƇŜŜŜƈ ſƀŚ est équivalent à: ʰ ſƀƇŜŜŜƈŵŵ ſƀŚ Ŷ on peut définir une fonction à l'intérieur d'une fonction, elle ne sera pas accessible de l'exterieu (comme pour toute autre variable) ſƀƇ ſƀƇ ŜſƀŚ ƈ ſŜƀŚ ſŜƀŚ ƈ ſƇśɨřśɑɑƈƀŚŵŵ śɨ ſɩƀŚŵŵ ś TYPAGE AVANCÉ Ŷ Types primitifs: contient une valeur simple, pas de méthode • : , • : nombres entiers et réels (IEEE 754 attention à la précision), ʫ , Ş , ɥŜɨʫɥŜɩŚŵŵͥɥŜɪɥɥɥɥɥɥɥɥɥɥɥɥɥɥɥɫ • • • ŵŵ ś ſŝƀ ɨŜſƀŚ ŜſƀŚ ŜſƀŚ ɑɑŜſƀŚ ŜſƀŚ TYPAGE AVANCÉ Ŷ Types complexes, c'est-à-dire avec des méthodes prédéfinies • et ses types dérivés - , , , , , , , , , ... ʰſƀŚ ŜſƀŚŵŵͥɑɑ ʰſɪŜɨɫƀŚ ŜſƀŚŵŵͥɑɪŜɨɫɑ ATTENTION AUX TYPES Ŷ Les variables de type primitif ne sont pas des objets, ce qui peut donner lieu à des comportements bizarres (type coercion) ʰɑřɑŚ Śŵŵͥɑɑř ŜʰɨɬŚŵŵͥɨɬɐ ²ſſƀƀŜʰɨɬ Śŵŵͥɑɑɐ ² Ŝŵŵͥ± ɐ Ŷ Dans ce cas, utiliser directement une variable de type Object, plus précisément de type String ʰſɑřɑƀŚ Śŵŵͥ ś± ŜʰɨɬŚŵŵͥɨɬ ŜŚŵŵͥɨɬ²² STRING ʰſɑřɑƀŚ Ŝ ſɥƀŚ Ŝ ſŜŞɨƀŚ ŜſɨřɫƀŚ Ŝ ſɨřɫƀŚ Ŝ ſŞɪƀŚ ŜſɑɑƀŚ Ŝ ſɑɑƀŚ ŜſɑɑřɪƀŚ ŜſɑřɑƀŚ Ŝ ſɑɑřɑ ɑƀŚ ŜſƀŚ MATH ŜſɩřɬɪƀŚ ŜſŜɭƀŚ Ŝ ſŜɭƀŚ ŜſŜɭƀŚ ŜſŞɬƀŚ ŜſřřƀŚ ŜſřřƀŚ ŜſƀŚ Ŝ Ś ŜŚ ŜſɪƀŚ ŜſɪřɨŵɪƀŚ ŜſɥƀŚ ŜſɨɥƀŚ ŜſɨɥɥƀŚ ŜɨɥŚ ŜſɬɨɩƀŚ ŜɩŚ ŜſɪƀŚ ARRAY ʰſƀŚŵŵ ² ʰƃƄŚŵŵ ² ʰƃɨřɩřɪƄŚ ŜŚŵŵͥɪ ŜſɫƀŚ ʰŜſƀŚŵŵͥɫ ƃɨƄŚŵŵƃɨƄ ɨŚŵŵͥ ŜŚŵŵͥɪś² ŜſƀŚŵŵͥɑɨřɩřɪɑ ŜſɑɑƀŚŵŵͥɑɨɩɪɑ ŜſƀŚ ŜſƀŚ Ŝ ſŝƀŚ Ŝ ſŝƀŚŵŵŞɨřŞɪɐ±ŝ Ŝ ſŝƀŚŵŵ ŜſƀŚŵŵʰ ŜſƀŚŵŵ ŜſƀŚŵŵ ſƀ ARRAY EN ES 5 Ŝ ſƀŚŵŵ ŜſƀŚŵŵʫ² ŜſƀŚŵŵ ² ŜſƀŚŵŵĺĺ² ŜſƀŚŵŵŶŶ² Ŝ ſřƀŚŵŵ²² ŵŵ² ² Ŝ ſřƀŚŵŵ ŜſƀŚ Ŝ ſƀŚ ŜſƀŚ THIS Ŷ est un mot-clé, similaire mais différent des autres langages (tel que Java ou C++) Ŷ Le code JavaScript s'exécute (presque) toujours avec un défini: • En dehors d'une fonction, représente le contexte d'exécution global, c'est-à-dire: - L'objet dans les navigateurs ʰʰʰŚŵŵ - L'objet dans NodeJS ʰʰʰŚŵŵ • Dans une fonction: - l'objet sur lequel la fonction a été appelée (s'il existe), - le du contexte d'execution global (si pas d'objet appelant) en mode normal ou - en "strict mode". THIS - EXEMPLES ʰƇƈŚ ſƀƇʰʰʰŚƈ Ŝʰ ſƀƇ ŜʰɩŚ ʰʰʰŚ ƈ ſƀŚŵŵͥ ŜſƀŚŵŵͥ ŜŚŵŵͥɩś²²² ŜŚŵŵͥśɐ ſƀƇŜʰɩŚƈ ʰſƀŚŵŵ ³ ŵŵ řśʰʰʰͥ ŜŚŵŵͥɩ MODIFIER THIS CALL, APPLY ET BIND Ŷ Possibilité de donner un explicite/différent de l'objet normal ʰƇ śɩř ś ſřƀƇ ŜſŜʫʫƀŚƈ ƈŚ ŜſɨřɩƀŚŵŵɬś² ʰƇśɪƈŚ ŜſɨřɩƀŚŵŵś ŜŜ ſřɨřɩƀŚŵŵɭś² ŜŜſřƃɨřɩƄƀŚŵŵɭś² Ŷ Possibilité de créer une fonction avec un différent pour l'appeler plus tard ʰŜŜſřɨřɩƀŚŵŵ ²ɐ ŵŵ²² ſƀŚŵŵ² ʰɨɩ THAT/SELF/ME CLOSURES Ŷ Particularité très importante de JS, à la base de nombreuses bibliothèques JS • Une fonction javascript peut retourner une valeur de type "fonction" (high-order function) • Les variables d'une fonction mise dans la pile d'appels restent disponibles après que cette fonction ait été dépilée ſƀƇ ʰɑ ɑŚ ſƀƇ Śƈŵŵɐɐ² ɐ ɐ Ś ƈ ʰ ſƀŚŵŵ ſƀŚŵŵͥɑ ɑ Ŷ Permet d'éviter d'exposer des variables tout en permettant leur manipulations • Mécanisme d'encapsulation CLOSURES: EXEMPLE D'ERREUR CLASSIQUE ſƀƇ ʰƃƄŚ ſʰɥŚʳɪŚʫʫƀƇ ƃƄʰ ſƀƇ ŜſƀŚƈŚ ƈ Ś ƈ ʰſƀŚ ƃɥƄſƀŚŵŵͥɪ ƃɨƄſƀŚŵŵͥɪ ƃɩƄſƀŚŵŵͥɪ Ŷ Explication du problème: • f n'est appelée qu'une seule fois: une seule variable i est présente dans l'espace réservé à f dans la pile d'appels • Au moment d'appeler b[n], dans cet espace, i vaut 3 CLOSURES: CORRECTION ſƀƇ ſƀƇ ŜſƀŚƈŚ ƈ ſƀƇ ʰƃƄŚ ſʰɥŚʳɪŚʫʫƀƇ ƃƄʰſƀŚ ƈ Ś ƈ ʰſƀŚ ƃɥƄſƀŚŵŵͥɥ ƃɨƄſƀŚŵŵͥɨ ƃɩƄſƀŚŵŵͥɩ Ŷ Solution: • On résoud le problème en appelant n fois une autre fonction • qui va créer n espaces de stockage dans la pile d'appels pour j CLOSURES: CORRECTION (2) ſƀƇ ʰƃƄŚ ſʰɥŚʳɪŚʫʫƀƇ ƃƄʰſ ſƀƇ ſƀƇ ŜſƀŚƈŚ ƈƀſƀŚ ƈ Ś ƈ ʰſƀŚ ƃɥƄſƀŚŵŵͥɥ ƃɨƄſƀŚŵŵͥɨ ƃɩƄſƀŚŵŵͥɩ Ŷ Plus compact en créant une fonction anonyme, auto-appelée • pratique courante dans les bibliothèques JS • à éviter UTILISATION DES CLOSURES FAIRE DES MODULES SANS CLOSURE ʰƇ ɏśɥř ɏśɨɪř ɏśɑɑř ś ſƀƇ ɏʫʫŚ ɏŚ ƈ ś ſƀƇ ɏʰɥŚ ŜɏʰŚ ƈ ƈ ʰ ŜſƀŚ ʰ ŜɏŚ ŜſɨƀŚ ŜɏʰɩɩŚ Ŷ possibilité d'accéder à 'private_value' sans garder 'nb_get' cohérent UTILISATION DES CLOSURES FAIRE DES MODULES ʰſ ſƀƇ ɏʰɨɪŚ ɏʰɥŚ ʰƇƈŚ Ŝ ɏʰɑɑŚ Ŝʰ ſƀƇ ɏʰɥŚ ɏʰŚ ƈŚ Ŝʰ ſƀƇ ɏʫʫŚ ɏŚ ƈŚ Ś ƈƀſƀŚ Ŝ ɏŚŵŵͥɑɑ ŜſƀŚŵŵͥɨɪ Ŷ closure autour de 'private_value' pour cacher la mécanique interne (encapsulation) Ŷ objet retourné comme interface (fonctions et attributs) JAVASCRIPT PROGRAMMATION ORIENTÉ-OBJET Ŷ JavaScript est orienté-objet • possède la notion d'objet • mais pas la notion de "classe" (sauf à partir de ES 6) • remplacée par la notion très particulière de prototype - qui permet de reproduire la notion de "classe" - et plus • possède la notion d'héritage - mais pas de polymorphisme LES OBJETS CONSTRUCTEUR ET INITIALISATION ʰƇƈŚ ŜʰɩŚ Ŝʰ ſƀƇŜŜŜƈŚ ʰƇ śɑɑř ś ſƀƇŜŜŜƈ ƈ ſɨřɩƀƇ ŜɨʰɨŚ ŜɩʰɩŚ Ŝʰ ſƀƇŜŜŜƈŚ ƈ ŵŵ ɐɐ ʰſɨřɑɑƀŚ ʰ ſƀŚ ʰ Ŝ ſƀŚ PROTOTYPE ET HÉRITAGE Ŷ On peut indiquer qu'un objet hérite les propriétés d'un autre objet Ŷ en modifiant la propriété du constructeur ſƀƇŜʰŚƈŵŵ ʰſɥƀŚŵŵƇśɥƈ Ŝ Śŵŵ ŜʰƇśɩƈŚŵŵ ²² ŵŵ²² ʰſɨƀŚŵŵƇśɨřśɩƈ ʰſɪƀŚŵŵ Ƈśɪřśɩƈ ŚŵŵƇśɥƈ ŵŵ ɐ³ ŜŜʰɑɑŚŵŵ ŚŵŵƇśɨřśɩřśɑɑƈ Śŵŵ Ƈśɪřśɩřśɑɑƈ ŚŵŵƇśɥƈ Ŷ On peut aussi utiliser Ŝ ʰ Ŝ ſƇśɩƈƀŚ PROTOTYPE ET CHAÎNE D'HÉRITAGE Ŷ Quand on accède à une propriété d'un objet, cette propriété (potentiellement une fonction) est cherchée en remontant la chaîne de prototype (héritage): • soit elle est sur l'objet: c'est sa propre propriété (Ŝſƀ) • si son prototype est non-null, on cherche récursivement sur l'objet prototype • sinon la propriété n'existe pas ſƀƇ Ŝʰ ſƀƇ ŜſɑɑƀŚƈŚ Ŝʰ ſƀƇ ŜſɑɑƀŚƈ ƈ ʰſƀŚ ſƀƇ Ŝʰ ſƀƇ ŜſɑŠɑƀŚƈŚ ƈ ŜʰſƀŚ ʰſƀŚ ŜſƀŚŵŵŠ ŜſƀŚŵŵ Śŵŵ Śŵŵ Ŷ Quand on appelle une fonction héritée, représente l'objet (pas le prototype) OBJET PROPRIÉTÉ D'INSTANCE ET PROPRIÉTÉ STATIQUE Propriété de toutes les instances ſƀƇŜʰŚƈ ʰ ſɨɥƀŚ ŜŚ ʰ ſɨɩƀŚ ŜŚ Propriété d'une instance ſƀƇŜʰŚƈ ʰ ſɨɥƀŚ ŜʰɩŚ ʰ ſɨɩƀŚ ŜŚŵŵ Propriété statique ſƀƇŜʰŚƈ ŜʰɪŚ ʰ ſɨɥƀŚ ŜŚŵŵŚ ŜŚŵŵɪ AJOUTER DES MÉTHODES À UNE CLASSE Ŷ JavaScript est dynamique Ŷ On peut ajouter des méthodes à un prototype, y compris d'une classe "système" (attention!) ŜŜʰ ſƀƇ ʰŜſƀŚ ſʴʰɥƀƇ Ŝ ſřɨƀŚ ƈ ƈŚ ŜŜʰŜŜŶŶ ſƀƇ ſŠƀŚ Ŝ ſŵɋɎʫŶɎʫɛŵřɑɑƀŚ ƈŚ ATTENTION: FOR/IN Ŷ Les boucles ſƀƇŝƈ incluent les propriétés héritées Ŷ Sauf si on utilise ſƀ ſƀƇ ſŜſƀƀƇ ŝ ƈ ƈ JAVASCRIPT STRICT Ŷ Possibilité d'utiliser une version plus stricte de JavaScript ɑ ɑŚ ſƀƇ ɑ ɑŚ ƈ • n'est pas optionnel • fonctions appelées sans : est , au lieu d'être l'objet global • des erreurs "silencieuses" font un throw • ſƀ ne crée rien dans global (pas de variables, pas de fonctions) • pas de "EVAL IS EVIL" Ŷ Possibilité d'évaluer une chaîne de caractères comme étant du JavaScript ſɑɪʫɩɑƀŚŵŵͥɬ Ŷ est une fonction qui s'exécute là où elle est appelée, dans le contexte local Ŷ à éviter: empèche les optimisations NETTOYER SON CODE Ŷ JSHint Ŷ JSLint JS DANS LE SERVEUR Ŷ Ŝ: environnement d'execution de programmes JavaScript (moteur V8) en ligne de commande • permet d'utiliser JavaScript en dehors du navigateur • usage similaire à plein d'autres langages (java.exe, perl, python, ...) Ŷ démon http inclus, par défaut • permet de déployer un serveur web facilement • de développer la logique serveur en JavaScript • équivalent de J2EE, Apache Tomcat et les servlets en Java Ŷ Dispose d'un système de modules • possiblité d'importer une bibliothèque développée par quelqu'un d'autre • il existe un gestionnaire de modules/package: JSON Ŷ Utilisation de la syntaxe litterale JS pour transmettre des données Ŷ Lecture/ecriture: ʰ ŜſƀŚ ʰ ŜſƀŚ Ŷ Exemple: Ŝſƀŵŵͥ ɐƇɑ ɑśɑ ɑřɑɑśřɑɑśɑ ɑřɑ ɑśƇƈƈɐ Ŷ disponibilité • extension courante de ES3 • natif dans ES5 NOUVEAUTÉS ES 6