IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Héritage par prototype


Sujet :

JavaScript

  1. #1
    Invité
    Invité(e)
    Par défaut Héritage par prototype
    Bonjour à tous,

    Ces temps-ci je me consacre beaucoup au Javascript. J'ai testé un peu CoffeeScript parce qu'il fourni des astuces assez intéressantes. Je ne suis pas fan de la syntaxe en elle-même mais je me suis intéressé au comment de deux astuces particulières : le "=>" qui permet de binder une fonction à un scope précis, et l'héritage.

    Autant j'ai bien pigé le coup du "=>", autant j'ai quelques difficultés avec certaines instructions que CoffeeScript génère lors de l'héritage. Je ne comprend pas à quoi elles servent.

    Voici un exemple qui utilise la manière de faire de CoffeeScript :

    Code JavaScript : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    var utils = {};
     
    utils.anchor = function(callback, scope) {
        return function() {
            return callback.apply(scope, arguments);
        }
    };
     
    utils.hasProp = {}.hasOwnProperty;
     
    utils.extends = function(child, parent) {
        for (var key in parent) {
            if (utils.hasProp.call(parent, key)) child[key] = parent[key];
        }
        function constructor() {
            this.constructor = child;
        }
        constructor.prototype = parent.prototype;
        child.prototype = new constructor();
        child.super = parent.prototype;
        return child;
    };
     
    var Person = function() {
        function Person(name) {
            this.name = name;
     
            this.hello = utils.anchor(this.hello, this);
            this.present = utils.anchor(this.present, this);
        }
     
        Person.prototype.hello = function() {
            console.log('Hello !');
        };
     
        Person.prototype.present = function() {
            console.log('My name is ' + this.name);
        };
     
        return Person;
    }();
     
    var Student = function() {
        utils.extends(Student, Person);
     
        function Student() {
            return Student.super.constructor.apply(this, arguments);
        }
     
        Student.prototype.present = function() {
            Student.super.present.apply(this, arguments);
            console.log('Im a student');
        };
     
        return Student;
    }();
     
    var toto = new Person('toto');
    toto.hello();
    toto.present();
    setTimeout(toto.present, 1000);
    var titi = new Student('titi');
    titi.hello();
    titi.present();
    setTimeout(titi.present, 1000);

    Et voici le code avec certaines instructions commentées dont je ne comprend pas l'utilité : le code produit le même résultat.

    Code JavaScript : 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    var utils = {};
     
    utils.anchor = function(callback, scope) {
        return function() {
            return callback.apply(scope, arguments);
        }
    };
     
    //utils.hasProp = {}.hasOwnProperty;
     
    utils.extends = function(child, parent) {
        /*for (var key in parent) {
            if (utils.hasProp.call(parent, key)) child[key] = parent[key];
        }*/
        function constructor() {
            //this.constructor = child;
        }
        constructor.prototype = parent.prototype;
        child.prototype = new constructor();
        child.super = parent.prototype;
        return child;
    };
     
    var Person = function() {
        function Person(name) {
            this.name = name;
     
            this.hello = utils.anchor(this.hello, this);
            this.present = utils.anchor(this.present, this);
        }
     
        Person.prototype.hello = function() {
            console.log('Hello !');
        };
     
        Person.prototype.present = function() {
            console.log('My name is ' + this.name);
        };
     
        return Person;
    }();
     
    var Student = function() {
        utils.extends(Student, Person);
     
        function Student() {
            return Student.super.constructor.apply(this, arguments);
        }
     
        Student.prototype.present = function() {
            Student.super.present.apply(this, arguments);
            console.log('Im a student');
        };
     
        return Student;
    }();
     
    var toto = new Person('toto');
    toto.hello();
    toto.present();
    setTimeout(toto.present, 1000);
    var titi = new Student('titi');
    titi.hello();
    titi.present();
    setTimeout(titi.present, 1000);

    Est-ce que quelqu'un comprend l'utilité des lignes commentées du deuxième code ?

    Merci par avance !

  2. #2
    Membre actif Avatar de MaitreKaio
    Profil pro
    Freelance Java / Web / Mobile
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance Java / Web / Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 240
    Points
    240
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (var key in parent) {
            if (utils.hasProp.call(parent, key)) child[key] = parent[key];
        }
    Ce code sert à recopier dans l'enfant toutes les propriétés du parent. Probablement que c'est utile au fonctionnement interne du langage ?
    J'ai des questions à toutes vos réponses (Woody Allen)
    Mon entreprise: http://qi2-software.fr
    Mon blog Java: http://torrefacteurjava.fr
    Mon blog Pas Java: http://bloq.qi2-software.fr

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 638
    Points : 66 668
    Points
    66 668
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //utils.hasProp = {}.hasOwnProperty;
    ceci sert à verifier si les propriétés de l'objet sont natives ou étendues
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Merci pour vos réponses !

    Effectivement, je n'avais pas pensé au cas où des propriétés étaient insérées directement dans la fonction parente. Du coup si on fait quelque chose du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parent.something = function() { /* ... */ }
    avant l'exécution de l'héritage, alors Enfant aura aussi la propriété something.

    EDIT :
    Le coup du "this.constructor = child;" s'éclaire aussi.
    Dans le code posté, il n'est pas utilisé, mais si on rajoute à la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    console.log(toto.constructor);
    console.log(titi.constructor);
    le premier code affichera "Person" et "Person"
    le deuxième code affichera "Person" et "Student"
    Je n'avais pas saisi ça car je n'ai jamais utilisé la propriété constructor stockée dans le __proto__.
    Dernière modification par Invité ; 11/02/2013 à 16h20.

  5. #5
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Le simple fait d'assigner au prototype d'un nouvel objet un autre objet permet de lui assigner toutes ses propriétés.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008R2] Clause SELECT avec héritage par partition
    Par Jah73 dans le forum Développement
    Réponses: 4
    Dernier message: 29/10/2013, 15h00
  2. Réponses: 3
    Dernier message: 18/10/2010, 14h19
  3. Unités de persistance et héritage par jointure
    Par le2tbomi dans le forum Java EE
    Réponses: 0
    Dernier message: 04/10/2010, 15h04
  4. Fonctions à arguments variables rendues impossibles par prototype
    Par Difré91 dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 14/06/2010, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo