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