(Re)apprendre Javascript – Episode I

Nombreux sont les développeurs qui détestent Javascript. Pourtant, on leur demande de plus en plus souvent de “mettre un peu d’AJAX sur le site web”.

C’est à ces développeurs que ce billet s’adresse.

Javascript est un langage riche, orienté objet et facile à apprendre.

Les bases
Le site Mozilla Developer Connection reste la source de documentation Javascript la plus complète. Pour la syntaxe et les types de base, lire l’article A re-introduction to Javascript.

Les objets
Un objet Javascript est comparable à un tableau associatif. La façon la plus simple de créer un objet est:

var o = {};
o.name = "hello";
o.setName = function(name) {
  this.name = name;
}

Dans cet exemple, o est un objet, sa propriété name a la valeur hello, et sa propriété setName est une fonction.

Classes et héritage
Javascript permet d’implémenter la notion de classe de la façon suivante:

  • une Classe est un objet de type Function
  • cet objet possède un membre magique nommé prototype
  • lorsqu’on invoque cet objet avec l’operateur new, un nouvel objet vide est crée et le prototype est recopié à l’intérieur.

Exemple:

var MyClass = function() {
  //contructeur
  this.name = "default name";
};
MyClass.prototype = {
  //prototype
  setName: function(name) {
    this.name = name;
  }
};

var o = new MyClass();
alert(o.name); // "default name"
o.setName("nouveau nom");
alert(o.name); // "nouveau nom"

Il existe plusieurs façons d’écrire des classes. Consulter l’article Classical inheritance in Javascript pour un tour d’horizon complet.

Droits d’accès
En Javascript, tout est public. La meilleure façon de préserver la notion d’encapsulation est par la convention. Par exemple, chez Exalead un membre privé commence par le caractère _.

Tout dynamique
En Javascript, tout peut changer tout le temps. Même les méthodes. C’est particulièrement pratique pour construire des interfaces utilisateur basées sur des évènements:

o.onReceiveSomeEvent = function() {// do something};

Il est même possible d’enrichir les types de base en rajoutant des méthodes à leur prototype. Par exemple:

String.prototype.blank = function() {
  return /^\\s*$/.test(this);
}
"hello".blank(); // false
"     ".blank(); // true

Le DOM – Document Object Model

Javascript est exécuté dans un Navigateur web, au sein d’une page HTML. Une représentation Javascript de la page HTML est systématiquement contruite par le Navigateur. Cette représentation, qui s’appelle le DOM, est accessible via l’objet window. Bien entendu, le DOM diffère entre navigateurs. Alors comment écrire un programme qui fonctionne partout ? Deux approches:

1ère approche:

if (navigator.appName == "Microsoft Internet Explorer"
    && navigator.appVersion >= "4.0") {
  element.attachEvent("onclick", function() { alert("click"); });
}

if (navigator.appName != "Microsoft Internet Explorer"
    && navigator.appName != "Netscape") {
  element.addEventListener("click", function() { alert("click"); });
}

Cette approche est la plus triviale et la moins élégante. Elle rend le partage de code complexe et amène inexorablement le développeur à détester Javascript.

2e approche:

if (element.attachEvent) {
  element.attachEvent("onclick", function() { alert("click"); });
}
if (element.addEventListener) {
  element.addEventListener("click", function() { alert("click"); });
}

Bien meilleure, cette approche utilise une des forces de Javascript: tester si une fonction existe. Elle permet d’obtenir une compatibilité maximale sans avoir à connaître l’intégralité de tous les navigateurs existants.

Voilà pour aujourd’hui. La semaine prochaine, nous continuerons avec une dissection en règle de la fameuse librarie Prototype.

Damucho, pour l’équipe WebDev

Les commentaires sont fermés.