Menu ▾ ▴

NotesJavascriptPrototype

Michel RENON

pour définir les objets et classes, on va utiliser un principe plus simple, une syntaxe plus simple et on obtient des performances très améliorées !

Le principe est via les Prototypes.
Chaque instance d'objet a un pointeur interne vers un auyre objet : quand on fait appel à un champ ou une méthode qui n'existe pas dans l'objet le runtime va le chercher dans le prototype. Pour un objet, on peut changer de prototype à la volée, de même que modifier le prototype à la volée (ajout/suppression de méthodes/champs)

Au niveau syntaxe, cela s'écrit :

function maClass() {
    this.champ1 = val1;
    this.champ2 = val2;
}
maClass.prototype.methode1 = function() {
    ...
    this.champ1
    ...
}
maClass.prototype.methode2 = function() {
    ...
    this.champ1
    ...
}
var inst1 = new maClass();
var inst2 = new maClass();





REMARQUE : pourquoi ne pas écrire :

function maClass() {
    this.champ1 = val1;
    this.champ2 = val2;

    this.methode1 = function() {
        ...
    }
    this.methode2 = function() {
        ...
    }
}

Même si cela produit du code qui fonctionne pareil, il y a une différence importante : les performances lors de la création.
L'idée est que les méthodes sont re-crées à chaque création d'instance.
Alors qu'avec les méthodes gérées par le prototype, elles sont créées une seule fois ; Quand on boucle sur la création d'instance, on a un gain de temps x3 ou x4 !!!!

Donc, quand on ait qu'on ne va pas créer un nombre important d'instance (en général, quand on va créer une variable globale), on prend cette notation.

var GlobalVAR = function () {
    this.champ1 = val1;
    this.champ2 = val2;

    this.methode1 = function() {
        ...
    }
    this.methode2 = function() {
        ...
    }
}

ou même en directement en JSON :

var GlobalVAR = {
    champ1 : val1,
    champ2 : val2,

    methode1 : function() {
        ...
        this.champ1
        ...
    }
    methode2 : function() {
        ...
        this.champ1
        ...
    }
}





REMARQUE : Dans un exemple, j'ai vu le code :

function maClass() {
    this.champ1 = val1;
    this.champ2 = val2;

}
maClass.prototype = {
    ...
    champ1 : null,
    champ2 : null,
    champ3 : null,
    champ4 : null,
    ...
}

Cela est TRES subtil !

  • il semble que le prototype soit totalement redéfini (à vérifier)
  • mais surtout, il y a initialisation des champs du prototype

C'est ambigu avec la création des champs dans le constructeur.
je pense que cela peut générer des pbs dans la recherche des champs.


Related

Wiki: NotesJavascript