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 :

Objet literal ou prototype


Sujet :

JavaScript

  1. #21
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    C'est prendre le problème à l'envers, le paradigme de la POOP veut que l'on crée un objet à partir d'un prototype, et non pas qu'on réassigne le prototype d'un objet une fois instancié à partir d'un autre prototype. La question à se poser, c'est pourquoi ton objet instancié n'est pas du prototype désiré. S'il s'agit d'un Object, ce n'est pas un problème : c'est même plutôt une recommandation de passer un objet en argument aux fonctions constructeur pour l'initialisation. Et beaucoup de fonctions natives comme JSON.parse() fonctionnent avec des Object, donc le passage en Object est obligatoire. Par contre, pour tous les cas plus complexes de cast d'un objet en un autre, je ne vois pas comment une réattribution dynamique du prototype pourrait être une bonne idée. C'est à la fois moins flexible et moins performant que d'écrire une fonction constructeur spécialement pour le cast désiré, par exemple a = ClassA.fromClassB(b);.
    One Web to rule them all

  2. #22
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Points : 545
    Points
    545
    Par défaut
    Citation Envoyé par SylvainPV Voir le message
    La question à se poser, c'est pourquoi ton objet instancié n'est pas du prototype désiré.
    Ben a ma connaissance le JSON ne prévois pas de pouvoir spécifier le prototype pour l''instanciation
    Citation Envoyé par SylvainPV Voir le message
    Par contre, pour tous les cas plus complexes de cast d'un objet en un autre, je ne vois pas comment une réattribution dynamique du prototype pourrait être une bonne idée. C'est à la fois moins flexible et moins performant que d'écrire une fonction constructeur spécialement pour le cast désiré, par exemple a = ClassA.fromClassB(b);.
    Mes benchmarks démontre bien que si l'on dispose deja d'un objet, il est plus rapide de changer dynamiquement le proto que de créer un nouveau objet par un contructeur!
    par contre pour créer un nouveau objet, c'est plus performant d’utiliser l’opérateur new sur un constructeur que de créer un objet literal et ensuite assigner un proto !

    pour moi "caster" un objet ne signifie surtout pas de recréer un nouveau objet!
    peut tu me donner un exemple d’implémentation de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a = ClassA.fromClassB(b);
    ShaderElement : Bénéficier de l’accélération graphique simplement par une nouvelle balise HTML <shader>
    ODE.js : portage JavaScript du célèbre moteur physique 3D Open Dynamics Engine

  3. #23
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Ton benchmark n'est pas objectif: tu n'as pas compté l'instanciation de l'objet dans le test de réassignation de prototype. Tu ne peux pas comparer des tests s'ils n'ont pas rigoureusement la même entrée/sortie.

    Si j'inclus l'instanciation de l'objet (ou la retire des autres tests, c'est pareil), les résultats sont nettement en faveur du constructeur avec new:

    Nom : 78ajucX.png
Affichages : 74
Taille : 74,2 Ko

    http://jsperf.com/proto-reassignatio...ew-cosntructor

    Comme exemple de fonction de transtypage, ce qui me vient immédiatement à l'esprit ce sont les wrappers de primitive String(42), Number("42"). Pour l'implémentation, tout dépend des différences entre tes deux prototypes. Un exemple très simple:
    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
    function Time(hours, minutes, seconds){  this.hours = hours;
      this.minutes = minutes;
      this.seconds = seconds;
    }
     
     
    Time.prototype.toString = function(){
      return this.hours+"h"+this.minutes+":"+this.seconds;
    }
     
     
    Time.fromDate = function(d){
      if(d instanceof Date){
        return new Time(d.getHours(), d.getMinutes(), d.getSeconds())
      }
      return null;
    }
    Une réassignation du prototype n'est pas faisable ici, il faudrait que Time hérite de toutes les propriétés de Date.
    One Web to rule them all

  4. #24
    Membre confirmé

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Points : 545
    Points
    545
    Par défaut
    Citation Envoyé par SylvainPV Voir le message
    Ton benchmark n'est pas objectif: tu n'as pas compté l'instanciation de l'objet dans le test de réassignation de prototype
    Bien évidemment que je ne le prend pas en compte, mon 1er benchmark n’avais pas pour but de trouver la meilleur méthode d’instanciation (même si c’est intéressant de savoir que le new est plus rapide), mais de connaitre la meilleur méthode pour manipuler des collections, énorme, objets déjà instanciés avec le prototype Object !

    Ta méthode de cast utilise bien une nouvelle instanciation d’objet avec un constructeur par copie, du coup ça correspond bien, et de manière objective, à mon 1er benchmark !

    Par exemples ma base de données MongoDB dispose d’un polygone contenant plus de 1 millions de sommets sur lesquelles je souhaite effectuer des opérations géométriques, ben il est plus performant d’écrire cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    db.points.find({ polygoneID : "France"}).forEach(function(v)
    {
    	v.__proto__ = Vector2D;
    	v.normalize().translate({ x: 10, y : -2})
    })
    Que de ré-instancier le million de points :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    db.points.find({ polygoneID : "France"}).forEach(function(v)
    {
    	v = new Vertex2DConstructor(v);
    	v.normalize().translate({ x: 10, y : -2})
    })
    ShaderElement : Bénéficier de l’accélération graphique simplement par une nouvelle balise HTML <shader>
    ODE.js : portage JavaScript du célèbre moteur physique 3D Open Dynamics Engine

  5. #25
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Ce n'est pourtant pas ce que les benchs disent... Que l'objet soit déjà instancié ou pas ne change rien, ça revient à enlever la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var obj = {    x: Math.random() * 1000,
        y: Math.random() * 1000
      };
    des 3 tests ci-dessus, ce qui revient au même. Après il se peut que les résultats varient selon le type d'objet, mais new semble généralement bien plus rapide (de 2 à 10 fois plus rapide selon les navigateurs pour l'exemple Vertex2D que tu as choisi)
    One Web to rule them all

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/06/2014, 20h20
  2. objet literal et objet avec constructeur
    Par hellalaboy dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/07/2011, 14h31
  3. Bug ie7 . Objet javascript et prototype
    Par Sourrisseau dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/04/2009, 14h19
  4. [Prototype] Etendre l'objet Date
    Par mp59100 dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 24/02/2009, 08h54
  5. [Prototype] Une couche d'abstraction de l'objet XMLHTTPRequest
    Par Tanhys dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 31/03/2007, 15h12

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