Ajouter des méthodes

Parent Previous Next



Ajouter des méthodes



L'objet vu précédemment est simple. Il y a moyen de l'améliorer en lui ajoutant des méthodes. Les méthodes, vous savez ce que c'est car vous en avez déjà croisé dans les chapitres sur les tableaux. Si nous reprenons l'exemple précédent et que l'on souhaite ajouter un ami, il faut faire comme ceci :

var seb = new Person('Sébastien', 23, 'm', 'aîné', 'Javascripteur', []);

 

// On ajoute un ami dans le tableau « friends »

seb.friends.push(new Person('Johann', 19, 'm', 'aîné', 'Javascripteur aussi', []));

 

alert(seb.friends[0].nick); // Affiche : « Johann »


Avec ça, on peut aussi ajouter un ami à Johann :

seb.friends[0].friends.push(new Person('Victor', 19, 'm', 'aîné', 'Internet Hero', []));


Les possibilités sont infinies… 


Mais tout cela reste long à écrire. Pourquoi ne pas ajouter une méthode addFriend() à l'objet Person de manière à pouvoir ajouter un ami comme ceci :

seb.addFriend('Johann', 19, 'm', 'aîné', 'Javascripteur aussi', []);


Ajouter une méthode


Il y a deux manières de définir une méthode pour un objet : dans le constructeur ou via prototype. Définir les méthodes directement dans le constructeur est facile puisque c'est nous qui créons le constructeur. La définition de méthodes via prototype est utile surtout si on n'a pas créé le constructeur : ce sera alors utile pour ajouter des méthodes à des objets natifs, comme String ou Array.


Définir une méthode dans le constructeur


Pour cela, rien de plus simple, on procède comme pour les propriétés, sauf qu'il s'agit d'une fonction :

function Person(nick, age, sex, parent, work, friends) {

    this.nick = nick;

    this.age  = age;

    this.sex  = sex;

    this.parent = parent;

    this.work = work;

    this.friends = friends;

 

    this.addFriend = function(nick, age, sex, parent, work, friends) {

        this.friends.push(new Person(nick, age, sex, parent, work, friends));

    };

}


Le code de cette méthode est simple : il ajoute un objet Person dans le tableau des amis.


N'aurions-nous pas pu utiliser new this(/* ... */) à la place de new Person(/* ... */) ?


Non, car, comme nous l'avons vu plus haut, this fait référence à l'objet dans lequel il est appelé, c'est-à-dire le constructeur Person. Si nous avions fait new this(/* ... */) cela aurait équivalu à insérer le constructeur dans lui-même. Mais de toute façon, en tentant de faire ça, vous obtenez une erreur du type «this n'est pas un constructeur », donc l'interpréteur Javascript ne plante heureusement pas.


Ajouter une méthode via prototype


Lorsque vous définissez un objet, il possède automatiquement un sous-objet appelé prototype.


prototype est un objet, mais c'est aussi le nom d'une bibliothèque Javascript : Prototype. Faites donc attention si vous faites des recherches avec les mots-clés « Javascript » et « prototype », car vous risquez de tomber sur des pages de cette bibliothèque.


Cet objet prototype va nous permettre d'ajouter des méthodes à un objet. Voici comment ajouter une méthode addFriend() à notre objet Person :

Person.prototype.addFriend = function(nick, age, sex, parent, work, friends) {

    this.friends.push(new Person(nick, age, sex, parent, work, friends));

}

Le this fait ici aussi référence à l'objet dans lequel il s'exécute, c'est-à-dire l'objet Person.


L'ajout de méthodes par prototype a l'avantage d'être indépendant de l'objet, c'est-à-dire que vous pouvez définir votre objet dans un fichier, et ajouter des méthodes dans un autre fichier (pour autant que les deux fichiers soient inclus dans la même page Web).


En réalité, l'ajout de méthodes par prototype est particulier, car les méthodes ajoutées ne seront pas copiées dans les instances de votre objet. Autrement dit, en ajoutant la méthode addFriend()par prototype, une instance comme seb ne possèdera pas la méthode directement dans son propre objet, elle sera obligée d'aller la chercher au sein de son objet constructeur, ici Person. Cela veut dire que si vous faites une modification sur une méthode contenue dans un prototype alors vous affecterez toutes les instances de votre objet (y compris celles qui sont déjà créées), cette solution est donc à privilégier.


Créé avec HelpNDoc Personal Edition: Créer des livres électroniques facilement

Site à deux balles