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 :

prototype attribute et prototype property


Sujet :

JavaScript

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 506
    Points : 1 290
    Points
    1 290
    Par défaut prototype attribute et prototype property
    L'attribut prototype n'est pas la propriété prototype même si les deux ne sont pas toujours distinctement présentés dans les livres/tutoriels javascript.
    Ou en tout cas que je n'étais pas assez malin pour capter la nuance au premier coup d'oeil.
    Du coup forcément je me demandais pourquoi ce coup tordu avec les constructeurs si on veut simplement que le prototype de x soit y, pourquoi ne pas simplement faire x.prototype = y ??
    Bon, le franc est tombé, la lumière fût, et les bouquins javascript avancés deviennent de douces mélodies.

    Ce post parce que pour asseoir la compréhension j'ai fait un petit code qui illustre bien (je trouve) le propos et que je pense (naïvement?) qu'il peut en aider d'autres:

    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
    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
    <!DOCTYPE html>
     
    <head>
     
    <SCRIPT>
    "use strict";
     
    function startup(){
     
      var theConstructor = function() {};
      var parent = {toString: function() {return "parent";}};
      theConstructor.prototype = parent;
      var falseChild = {};
      falseChild.prototype = parent;
      var trueChild = new theConstructor();
     
      document.getElementById("display").innerHTML =
     
        "Object.getPrototypeOf(falseChild).toString() : " + Object.getPrototypeOf(falseChild).toString() + "<p>" + 
     
        "falseChild.prototype.toString() : " + falseChild.prototype.toString() + "<p>" + 
     
        "falseChild.toString() : " + falseChild.toString() + "<p>" + 
     
        "Object.getPrototypeOf(trueChild).toString() : " + Object.getPrototypeOf(trueChild).toString() + "<p>" + 
     
        "trueChild.prototype.toString() : " + (trueChild.prototype && trueChild.prototype.toString()) + "<p>" + 
     
        "trueChild.toString() : " + trueChild.toString() + "<p>" + 
     
        "Object.getPrototypeOf(theConstructor).toString() : " + Object.getPrototypeOf(theConstructor).toString() + "<p>" + 
     
        "theConstructor.prototype.toString() : " + theConstructor.prototype.toString() + "<p>" + 
     
        "theConstructor.toString() : " + theConstructor.toString() + "<p>" + 
     
        "";
      }
     
    </script>
     
    </head>
     
    <body onload="startup()">
     
    <div id="display">
    </div>
     
    </body>
     
    </html>

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 220
    Points
    91 220
    Billets dans le blog
    20
    Par défaut
    L'attribut prototype n'est pas la propriété prototype


    C'est quoi pour toi l'attribut prototype ?
    Autant, la propriété, je comprends, tout, en JavaScript est objet et chaque objet hérite d'un (ou plusieurs) prototype, mais "l'attribut prototype", là, vraiment, je vois pas de quoi tu parles...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    pareil que Bovino, je ne comprend pas tout dans ton post, pas même s'il y a une question ou s'il s'agit d'un partage de code ?

    aussi tu sembles pas mal t’emmêler les pinceaux.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var falseChild = {};
    falseChild.prototype = parent;
    un objet n'est pas censé avoir de prototype, c'est le constructeur qui possède un prototype pour que les objets instanciés par celui-ci héritent de ses propriétés. (certains navigateurs regroupent ces propriété ainsi héritées dans l'attribut "__proto__" de l'objet)
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 128
    Points : 210
    Points
    210
    Par défaut
    Oui, le prototype (la propriété interne [[prototype]]) ne peut être attribué "manuellement".

    Tu dois mettre ton prototype en valeur de la propriété "prototype", et à l'instanciation, le runtime vérifiera si tu as mis un objet dans la propriété "prototype" et si oui, le mettra en valeur de la propriété inter interne [[prototype]].

    L'algorithme d'instanciation est grosso modo un appel à la méthode interne [[construct]] décrite ainsi dans la norme :

    13.2.2 [[Construct]]
    When the [[Construct]] property for a Function object F is called, the following steps are taken:
    1. Create a new native ECMAScript object.
    2. Set the [[Class]] property of Result(1) to "Object".
    3. Get the value of the prototype property of the F.
    4. If Result(3) is an object, set the [[Prototype]] property of Result(1) to Result(3).
    5. If Result(3) is not an object, set the [[Prototype]] property of Result(1) to the original Object
    prototype object as described in 15.2.3.1.

    6. Invoke the [[Call]] property of F, providing Result(1) as the this value and providing the argument
    list passed into [[Construct]] as the argument values.
    7. If Type(Result(6)) is Object then return Result(6).
    8. Return Result(1).
    A noter que sous des version de firefox (pas les dernières) et sous Rhino, tu peux accéder directement à la propriété interne [[prototype]] via la propriété non-standard __proto__.

  5. #5
    Membre expérimenté Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Points : 1 519
    Points
    1 519
    Par défaut
    Citation Envoyé par TheGwy Voir le message
    7. If Type(Result(6)) is Object then return Result(6).
    8. Return Result(1).
    J'en apprend à chacun de tes posts.


    J'avais déjà eu affaire à des codes où le constructeur renvoyait un autre objet que le "this" (généré par le "new") et ça fonctionnait très bien.

    Par contre j'ignorais qu'il était impossible de renvoyer une primitive. (string, number, etc..)




    je me suis fais un petit code de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // --- SAMPLE 1 ---
    function A(){
    	return {v:1}; // return a new object
    }
    var a = new A();
    alert(a instanceof A); // FALSE
     
    // --- SAMPLE 2 ---
    function B(){
    	return 1; // returning a primitive value is forbidden -> THIS object is returned
    }
    var b = new B();
    alert(b instanceof B); // TRUE
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    eval(a='eval(a)')
    recursive make it evil
    eval make it eval

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 506
    Points : 1 290
    Points
    1 290
    Par défaut
    Citation Envoyé par Bovino Voir le message

    C'est quoi pour toi l'attribut prototype ?
    Autant, la propriété, je comprends, tout, en JavaScript est objet et chaque objet hérite d'un (ou plusieurs) prototype, mais "l'attribut prototype", là, vraiment, je vois pas de quoi tu parles...
    Justement l'attribut prototype d'un objet c'est "son" prototype au sens de l'héritage prototype de l'objet tandis que la propriété prototype d'un objet c'est une propriété comme une autre qui n'a pas de lien avec l'héritage.

    J'utilise le terme attribut au sens du javascript definitive guide:
    tout objet a 3 attributs: -extensible -prototype et -class.

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 506
    Points : 1 290
    Points
    1 290
    Par défaut
    Citation Envoyé par Willpower Voir le message
    pareil que Bovino, je ne comprend pas tout dans ton post, pas même s'il y a une question ou s'il s'agit d'un partage de code ?
    Aucune question, c'est juste un partage, pour ceux qui veulent, si c'est inintéressant pour toi parce que tu es plus avancé, pas de soucis.
    Citation Envoyé par Willpower Voir le message
    aussi tu sembles pas mal t’emmêler les pinceaux.
    Plus maintenant heureusement.
    Citation Envoyé par Willpower Voir le message
    un objet n'est pas censé avoir de prototype
    Rien ne l'empêche.
    Citation Envoyé par Willpower Voir le message
    c'est le constructeur qui possède un prototype
    Le constructeur est un objet aussi.

Discussions similaires

  1. [Prototype] Formulaire ajax
    Par Hesiode dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 23/01/2008, 14h08
  2. [Prototype] Ajax et chargement
    Par watchabongo dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 12/12/2007, 15h51
  3. [Prototype] Problème avec prototype
    Par OhAime971 dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 17/10/2007, 13h52
  4. [Prototype] L'encodage
    Par JamoS dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 28/09/2007, 16h36
  5. [Prototype] Function Ajax Prototype OnComplete
    Par PIEPLU dans le forum Bibliothèques & Frameworks
    Réponses: 2
    Dernier message: 21/08/2007, 18h09

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