Bonjour,

Je suis débutant en Javascript, mais il me semble qu'il y a une erreur sur le premier article sur la POO en javascript concernant l'accès au méthodes définies dans l'objet associé à la propriété prototype d'un constructeur. le cours est celui ayant pour titre Programmation orientée objet avec le langage Javascript (1ère partie) de Thierry Templier et le code concerné est celui du paragraphe 3.2 sur le Prototypage (deuxième portion de code).

Le code donné dans le cours est le suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
function MaClasse() {
    this.attribut = "valeur";
}
 
var obj1 = new MaClasse();
try {
    obj1.methode(); // Erreur car la méthode n'existe pas pour l'objet
} catch(err) {
    alert("Erreur: " + err);
}
 
MaClasse.prototype = {
    methode: function() {
        alert("Attribut: " + this.attribut);
    }
}
 
var obj2 = new MaClasse();
obj2.methode();
// Fonctionne correctement car la méthode a été ajoutée au prototype de MaClasse
Avant ce code, l'auteur écrit:
Une des caractéristiques importantes du prototypage est que les modifications de l'objet qui lui est associé, sont appliquées sur tous les objets qui vont été instanciés. Par contre, les objets précédemment instanciés ne sont pas impactés.
Bon, à part la faute de frappe "qui vont été instanciés" au lieu de "qui vont être instanciés", ce qui est faux c'est que les méthodes définies dans l'objet affecté à l'attribut prototype du constructeur s'appliquent aussi aux objets définis avant que cette méthode soit définie: les objets précédemment instanciés sont bien impactés, contrairement à ce qui est dit dans ce cours. Par contre, ce qui est vrai, c'est qu'on ne peut évidemment pas appeler cette méthode avant qu'elle soit définie dans le code, mais dans l'exemple de code ci-dessus donné dans le cours, si on écrit l'instruction obj1.method() après la définition de la méthode methode(), il n'y a pas d'erreur. En fait, comme dans tous langages, on ne peut appeler une fonction avant qu'elle soit définie ou que l'on ai défini son prototype dans le code. Du coup, si on appelle la méthode methode() après sa définition, que l'objet ait été créé avant sa définition ou après ne change rien: l'appel fonctionne bien et ne génère pas une erreur.

Par exemple, si on teste ce code:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
        function Personne(prenom, nom, age, genre, interets) {
            this.nom = {
                prenom: prenom,
                nom: nom
            };
            this.age = age;
            this.genre = genre;
            this.interets = interets;
            this.bio = function() {
                alert(this.nom.prenom + ' ' + this.nom.nom + ' a ' + this.age + ' ans. Il aime ' + this.interets[0] + ' et ' + this.interets[1] + '.');
            };
            this.salutation = function() {
                alert('Bonjour ! Je m\'appelle ' + this.nom.prenom + '.');
            };
        };
 
        p4 = new Personne('Arthur', 'Dupont', 33, 'Homme', ['Littérature', 'Informatique']);
        proto = Object.getPrototypeOf(p4);
 
        //Modifiaction du prototype du constructeur Personne
        Personne.prototype.aurevoir = function() {
            alert(this.nom.prenom + ' est sorti. Au revoir !');
        }
Si on exécute p4.aurevoir() dans la console, on a bien le message "Arthur est sorti. Au revoir" qui s'affiche dans la fenêtre. Tout fonctionne bien, sans générer d'erreur, même si p4 est créée avant de définir la méthode aurevoir().

A part ça, ça fait un petit moment que je n'avais pas écrit de messages sur le site developpez.com et je n'ai pas trouvé un moyen simple d'écrire un message à l'auteur. Il doit bien il y avoir un lien quelque part, mais je dois commencer à avoir la vue un peu brouillée

A part ce petit détail, ce cours est très clair et je remercie son auteur.

A bientôt