Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    View Cyril Durand's profile on LinkedIn

    hit counters

Quizz JavaScript - reponse : Le mot clé prototype - heritage en JavaScript

Voici avec un peu de retard la réponse au quizz JavaScript : le mot clé prototype.

La bonne réponse est :
Cyril
Je suis Cyril

En effet le prototype est le même pour toutes les instances d'un objet, il n'est pas figé lorsque l'on créer une instance, c'est une des particularités des langages dynamiques.

Le prototype est une propriété de l'objet function, il est créé dès que l'on appelle le constructeur d'une fonction c'est à dire dès que l'on fait une nouvelle instance d'une fonction :

var obj = new myFunction(); // obj.prototype existe

Cette propriété est un objet qui contient tous les membres (fonctions et propriétés) accessible par les instances de la fonction.

var f = function(){} f.prototype.hello = function(){ Sys.Debug.trace('hello'); } var o = new f(); o.hello(); // est accessible

On peut bien sur redéfinir un membre au niveau de l'instance d'un objet :

var f = function(){} f.prototype.hello = function(){ Sys.Debug.trace('hello'); } var o = new f(); o.hello = function(){ Sys.Debug.trace('hello modifié pour l'objet o uniquement'); } o.hello(); // affiche hello modifié ... var p = new f(); p.hello(); // affiche hello

En fait quand on appelle une méthode d'une instance, l'interpréteur JavaScript va d'abord regarder s'il trouve la méthode au niveau de l'instance puis il va regarder le prototype. Mais comme le prototype est une instance d'un objet il possède lui aussi un prototype, l'interpréteur va aussi regarder dans le prototype du prototype et ainsi de suite jusqu'à ce qu'il trouve la méthode. C'est une des façons de faire de l'héritage en JavaScript.

var f = function(){} f.prototype.hello = function(){ Sys.Debug.trace('hello'); } var g = function(){} g.prototype = new f(); g.prototype.coucou = function(){ Sys.Debug.trace('coucou'); } var o = new g(); o.coucou(); // affiche coucou o.hello(); // affiche hello

Lorsque l'interpréteur arrive sur o.hello() il va d'abord rechercher dans l'instance puis dans le prototype et enfin dans le prototype du prototype. On peut également redéfinir la méthode hello au niveau du type g et appeler la méthode hello de f, c'est à dire surcharger une méthode et appeler la méthode de base.

var f = function(){} f.prototype.hello = function(){ Sys.Debug.trace('hello from f'); } var g = function(){} g.prototype = new f(); g.prototype.hello = function(){ f.prototype.hello.apply(this, []); // appel de la méthode de base Sys.Debug.trace('hello from g'); } var o = new g(); o.hello(); // affiche hello from g et hello from g

Bien sur, on peut encore faire pleins d'autres choses avec le prototype d'une fonction, mais le but ici est de montrer que l'on peut changer les méthodes d'un type n'importe quand, le prototype n'est pas figé à une instance d'un objet.

En savoir plus sur le mot clé prototype :

Posted: mardi 28 août 2007 12:08 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- La suite ...Proposition de collaboration rédactionnelle entre les communautés de développeurs et Microsoft France par LucasR le il y a 11 heures et 46 minutes

- [Fun] Votre simulateur de vol avec Microsoft ESP par Julien Chable le il y a 17 heures et 29 minutes

- [Best Practices] Customisation du My Site : Comment le modifier en amont et en aval par The Mit's Blog le il y a 18 heures et 43 minutes

- Patrick Tisseghem s'en est allé ... par The Mit's Blog le il y a 19 heures et 27 minutes

- MS AutoCollage par alex# le il y a 20 heures et 13 minutes

- Un grand SharePointeur nous a quitte : Patrick Tisseghem manquera à la communauté ! par RedoBlog - The .NET Gentleman !!! le il y a 20 heures et 38 minutes

- [WPF] Comment charger dynamiquement un fichier XAML qui définit des eventhandler ? par Thomas Lebrun le 09-04-2008, 10:56

- Article sur le filtrage des modèles de site SharePoint par The Grib's Lair [Sébastien PICAMELOT - MVP SharePoint] le 09-04-2008, 00:11

- Adopter votre Redo en 3D - Clone Virtuel - avec photosynth par RedoBlog - The .NET Gentleman !!! le 09-04-2008, 00:07

- [Expression Web] Astuce de la Semaine : Mettre en bouton ses macros dans une barre d'outils. par Expression Web & Me le 09-03-2008, 20:48