Le problème lorsque l'on cherche à apprendre un nouveau langage est que l'on se retape systématiquement les bases : Les variables, les fonctions, les conditions... Ce qui peut s'avérer pénible lorsque l'on connait déjà un autre langage de programmation. Aussi, je vous propose d'utiliser les connaissances que vous avez déjà en PHP afin d'accélerer votre apprentissage du JavaScript.
Les variables
Les variables en JavaScript doivent être déclarées avant d'être utilisées mais il n'est pas nécessaire de les préfixer par un $
Il n'est d'ailleurs pas nécessaire de terminer nos instructions par des ;.
Les variables ont des types similaires à ceux que l'on connait en PHP. En revanche il n'existe pas de tableaux associatifs. Ils sont "remplacés" par des objets.
Pour la concaténation le JavaScript n'utilisent pas l'opérateur . mais une simple addition
Les conditions
Les conditions fonctionnent comme en PHP à un détail prèt
Les boucles
Les boucles s'écrivent de la même façon qu'en PHP avec le while ou le for
En JavaScript il n'existe pas de boucles foreach (on verra comment contourner le problème) plus tard
Les fonctions
Les fonctions peuvent s'écrire comme en PHP et sont un type de variable particulier. On pourra ainsi les stocker dans une variable.
La différence entre ces 2 manières de déclarer une fonction est expliquée dans le chapitre consacré à l'hoisting
En revanche il y a quelques différences avec PHP
- Une fonction a accès au contexte extérieur (variables externes à la fonction, en PHP on doit utiliser le
use ()pour obtenir un résultat similaire). - Une fonction peut être appellée avec un nombre incorrect de paramètre, les paramètres manquant prendront la valeur
undefined. - Il n'est pas possible d'assigner une valeur par défaut aux paramètres
- Les fonctions sont très souvent utilisées en callback (encore peu exploité en PHP)
En JavaScript tout est objet
En JavaScript les types de bases sont des "instances" de certains objet. Ils ont ainsi des méthodes et des propriétés spécifiques.
L'ensemble des méthodes et types primaires sont disponible sur la documentation MDN
POO en JavaScript
Le JavaScript est un langage entièrement objet qui ne partage pas la même logique que PHP. Je vais ici essayer de faire des analogies mais il faut savoir que le langage n'utilise pas de classes mais plutôt un système d'héritage basé sur les prototypes.
Notre première "classe"
Pour traduire ça en Javascript il faut créer un constructeur. On utilise pour cela une simple fonction
Lorsqu'une fonction est appellé avec l'opérateur new, elle est utilisé comme constructeur et génère un objet en utilisant le code de la fonction. On dit ainsi que jean est une instance de l'objet Eleve.
Si on souhaite maintenant créer une méthode accessible par toutes les instances de l'objet Eleve il faut l'assigner comme propriété de la propriété prototype de l'objet.
Cette manière de faire les choses apporte certaines particularités :
- Il n'existe pas de notion de visibilité privée / public / protégé
- Il est possible de redéfinir des méthodes sur l'instance
- Il est possible de modifier le prototype après coup, et ainsi donner à toutes les instances de nouvelles méthodes
- Si on souhaite créer une méthode "statique" il suffit de créer la méthode directement sur l'objet
Une méthode peut donc être définie sur l'objet directement ou sur le prototype (pour ainsi affecter les instances)
Le mot clef this
Attention au mot clef this car il n'a pas la même valeur qu'en PHP. Par défaut this prend comme valeur la variable globale (window sur le navigateur, global sur nodejs) mais sa valeur peut changer dans une fonction suivant comment elle est appellée.
thisprend comme valeur l'objet global par défaut- Si une méthode est appellée depuis un objet, this prendra comme valeur l'objet
- On peut appeller une méthode en changeant la valeur de this gràce à la méthode call()
L'héritage
Maintenant que l'on a vu l'équivalent d'une classe, comment se passe l'héritage ?
Pour reproduire ce système d'héritage en JavaScript il faut utiliser le système de prototype. En créant un prototype qui aura comme prototype le prototype de l'objet parent (c'est plus clair en lisant le code ^^)
Comme vous le voyez ici, l'héritage est beaucoup plus complexe à mettre en place qu'en PHP. Heureusement pour nous, le langage est en pleine transformation et il sera bientôt possible d'utiliser une syntaxe plus proche que ce que l'on connait en PHP avec le mot clef class (mais ce n'est pas encore disponible sur les navigateurs :().
Namespaces
Il n'existe pas de notion de namespace à proprement parler mais il est possible d'obtenir un principe similaire en mettant nos constructeur dans un plus gros objet.