2010-10-09 4 views
0

Disons que je veux créer un objet appelé 'Vertex'. Habituellement, en Java je le ferais par:Comment créer un objet JavaScript avec des variables et des fonctions définies?

public class Vertex { 

    // member variables 
    public data; 
    private id; 

    // member methods 
    public Vertex() { /* default constructor */ } 
    public getID() { return id; } 
} 

Maintenant, comment ferais-je cela en JavaScript? Je veux préserver privé vs public? C'est ce que j'ai mis en place jusqu'à présent, mais je ne pense pas que ce soit correct, et je n'ai jamais traité de POO en JavaScript.

/** 
* Vertex constructor. 
*/ 
function Vertex(object) { 

    data = object; 
    id = object.getCode(); // each Vertex will have a unique id which will be the city code 
}; 
Vertex.prototype = (function() { 
    // Private Members here 

    // Public Members inside return 
    return { 
    constructor : Vertex, 

    getID : function() { 

     return (id); 
    } 
}; 

Je ne connais pas du tout les prototypes, mais j'essaie d'apprendre. Est-ce la bonne façon de faire cela? Si ce n'est pas le cas, j'essaie d'accomplir ce que le code Java ci-dessus fait, mais en le faisant en JavaScript.

+0

duplication possible: http://stackoverflow.com/questions/55611/javascript-private-methods –

+0

@David, j'ai regardé ce post ... et je pense que je l'ai imité correctement, mais la raison pour laquelle je demande est parce que quand j'imprime mon objet Vertex à la console FireBug, il n'affiche aucune des valeurs ... donc je ne pense pas que l'objet est correct. – Hristo

+0

Note rapide ici, vos 'constructeurs par défaut 'sont inutiles, il n'y a pas de surcharge dans JS. –

Répondre

2

Il y a beaucoup de façons de faire un système de classe/instance semblable à ce que vous utilisez dans d'autres langues, de mise en œuvre curieuse de prototypes de JavaScript. Il n'y a pas un seul moyen accepté que tout le monde utilise, et beaucoup de compromis possibles pour la commodité et la performance. Voir this question pour une discussion des différents modèles de classe/instance communs.

Alors que peut reproduire (principalement) des variables privées en utilisant une fermeture, je déconseille fortement. Vous avez peu à gagner en apportant le modèle de privilèges de Java à JavaScript. Java a besoin de membres privés à appliquer dans le cadre de son modèle de sécurité. Mais JavaScript n'a pas de modèle pour les limites de sécurité sur la page, donc vous ne protégez pas votre code contre une utilisation abusive par quelqu'un d'autre que vous-même. Tout ce que les «vrais soldats» feront pour vous, c'est de travailler un peu plus vite sur le débogage et le prototypage. Considérons à la place d'utiliser le modèle du système d'honneur (comme dans Python par exemple). Préférez les membres pseudo-privés avec un soulignement pour signaler que ces membres ne doivent pas être accédés de l'extérieur.

0

Vous pouvez utiliser JSDoc pour ajouter des méta-informations (comme l'appartenance privée) à vos variables et fonctions. Des outils tels que le compilateur Google closure peuvent utiliser cette méta-information pour vérifier l'accès illégal de votre code à ces membres. (et beaucoup d'autres choses aussi)

Questions connexes