2011-09-20 2 views
4

quelle est la différence dans la construction de ces deux objets - en dehors de la vie privée de la variable membre?Construction d'objet Javascript: quelle est la différence?

function A() { this.a = 99; } 
A.prototype.setA = function(newVal) { this.a = newVal; } 
A.prototype.getA = function({ return this.a; } 

Et ceci:

function A() { 
    var a = 99; 
    return { 
     setA: function(newVal) { a=newVal; } 
     getA: function() { return a; } 
    } 
} 

Je ne suis pas intéressé à la vie privée de la variable membre tant que la façon dont les fonctions sont définies. Ai-je raison de penser que dans la deuxième version, tous les objets créés via le nouveau A() recevront des copies des fonctions définies, où comme dans la première version, tous les appels aux fonctions définies iront au seul et unique prototype objet (pour l'objet A). Est-ce correct?

Si oui, la version 2 a-t-elle des coûts de performance?

Également, est-ce qu'une méthode est préférée à une autre - ou y a-t-il une meilleure façon de procéder?

Merci beaucoup

+0

Setters & getters sont une idée horrible. Arrêtez de porter le code Java en javascript. – Raynos

+0

@Raynos, pas trop horrible pour être inclus dans ES5. – davin

+0

@davin c'est différent. Ce sont des getter/setters natifs (ils sont encore méchants). Les émulés comme 'setA' et' getA' sont plus que stupides. Les getter/setters natifs ne devraient vraiment être utilisés que pour faire des trucs intelligents, pas dans le code quotidien – Raynos

Répondre

6

Ai-je raison de penser que dans la deuxième version tous les objets créés via nouveau A() va obtenir des copies des fonctions définies, alors que dans la première version tous les appels à la fonctions définies vont à l' et seulement l'objet prototype (pour l'objet A). Est-ce correct?

Oui

Si oui ne la version 2 a des frais de performance?

Plus utilisation de la mémoire avec Seta et Geta par objet A

Aussi, est-il d'une manière préférée à une autre - ou est-il encore une meilleure façon ?

Puisque vous ne se soucient pas de l'encapsulation, utilisez prototype

1

La vie privée de la variable intérieure côté, ceux-ci doivent se comporter de la même, mais vous avez raison, la deuxième version utilisera plus de mémoire que la première . Ceci est généralement trivial sauf si vous travaillez avec un grand nombre d'objets, mais en utilisant l'approche prototype, il n'y a qu'une seule fonction getA et setA, alors qu'avec la seconde approche, chacun a ses propres fonctions pour ces méthodes.

1

Vous avez raison sur les deux comptes. Donc, la différence de performance serait la consommation de mémoire - la deuxième façon consomme plus pour chaque objet. De plus, chaque création/instanciation d'objet peut prendre un peu plus de temps dans la deuxième version parce que vous devez créer ces fonctions consommatrices de mémoire, bien que cela soit négligeable (dans ce cas).

Je recommande la méthode prototypique car, pour ces raisons, elle évolue légèrement mieux. En ce qui concerne la visibilité, même celle-ci peut être pseudo-implémentée de manière prototypique avec ES5.

2

La première méthode définit ces fonctions comme des propriétés de l'objet A.prototype, ce qui signifie que ces fonctions sont définies dans un emplacement pour toutes les instances de A.

La seconde méthode définit les fonctions (comme propriétés) directement sur l'objet d'instance, ce qui signifie que vous aurez un nouvel ensemble de fonctions pour chaque instance créée (= consommation de mémoire plus élevée).

L'avantage de la première méthode est que vous pouvez hériter des méthodes héritées si nécessaire. Cela ne peut pas être fait comme cela lors de l'utilisation de la seconde méthode.

L'avantage de la seconde méthode est que les fonctions capturent le contexte du constructeur, de sorte que vous pouvez avoir des variables privées et des fonctions dans le constructeur qui peuvent ensuite être utilisées par vos fonctions.

Cela ne peut pas être fait avec les fonctions définies sur le prototype.


Donc, mon conseil serait: Si vous avez besoin des variables privées ou fonctions, utilisez la deuxième méthode. Sinon, utilisez le prototype.

+0

+ 1 pour avoir bien résumé les différences et recommandé quand les utiliser. – jfriend00

Questions connexes