2010-12-14 81 views
3

Je suis en train de réexaminer une grande partie de mon code, et je reviens toujours à la question: «Sur quel modèle puis-je baser toutes mes classes JS?Quels modèles de programmation Javascript utilisez-vous?

Certains modèles par exemple: http://www.klauskomenda.com/code/javascript-programming-patterns/

J'ai fini avec une approche mix-in, avec des fonctionnalités pub/sous-base. Je n'utilise pas de prototype, ou le modèle de module, je définis les propriétés/méthodes publiques/privées dans le constructeur.

Par exemple:

function ClassName(){ 
    var _privateVar = 'private'; 
    this.publicVar = 'public'; 
    function _privateMethod(){}; 
    this.publicMethod = function(){}; 
} 

Quels modèles utilisez-vous souvent dans JS? Dans quel but? Sites Web réguliers? Application Web complète? Qu'est-ce qui vous a fait choisir un motif plutôt qu'un autre? Ou pensez-vous que cela importe moins que je ne le pense?

Merci d'avance.

EDIT: bien, j'utilise un prototype, juste pour ne pas définir toutes mes méthodes. Mais je penche pour cette approche en raison de la performance? Pensées?

+3

Peut-être que cette question est mieux adaptée à programmers.stackexchange.com – Keyo

+1

Je pense qu'il importe moins que Je pense que oui. : p – Stephen

Répondre

2

Certaines choses à considérer

Définition des fonctions publiques avec des fonctions internes est plus coûteuse, car vous créez une nouvelle fonction pour chaque instanciation d'un objet. Le définir sur le prototype utilise une seule copie des méthodes.

J'utilise toujours des traits de soulignement pour les méthodes/propriétés privées, comme vous l'avez fait, pour plus de clarté.

J'utilise également le modèle de module pour définir des méthodes privées statiques dans une classe. Comme ils n'ont pas besoin d'accéder à l'instance, ils ne sont créés qu'une seule fois.

+0

+1 pour le coût. Il peut être minimal pour quelques instances d'objet, mais je ne peux pas croire combien de fois il est apparemment négligé, et les membres/méthodes privés sont surestimés. –

+0

Je ne pense pas que les membres privés sont surestimés. Cependant, je pense qu'un bon compromis est d'utiliser le trait de soulignement. De cette façon, quelqu'un peut toujours pirater les données personnelles de quelqu'un d'autre, mais sachez que ce n'est pas supporté. –

1

Nous utilisons le modèle de module à tinyHippos.

Voici un blog que nous avons écrit sur le sujet here

Fondamentalement, vous vous retrouvez avec:

var nameSpace = {}; 

// class constructor 
nameSpace.SomeClass = function (arg1, arg1) { 

    var _privateProperty = "foo"; 

    function _privateMethod() {} 

    // return public methods 
    return { 
     publicProperty: "bar", 
     publicMethod: function publicMethod() { } 
    }; 

}; 

var obj = new nameSpace.SomeClass("arg1", "arg2"); 
+0

En quoi cela diffère-t-il simplement de la définition des fonctions/accessoires internes privés et des fonctions publiques sur les accessoires de 'ceci'? –

+0

@JuanMendes le mot clé 'new' est facultatif dans cet exemple. 'var obj = namespace.SomeClass (" arg1 "," arg2 ");' fonctionne également. – Raynos

+0

Ça "fonctionne". Les deux cas provoquent 'obj instanceof nameSpace.SomeClass' pour renvoyer false. Pour moi, n'importe quel modèle pour la création d'objet ne devrait pas casser 'instanceof '. J'ai posté quelque chose à propos de la construction d'un objet avec ou sans 'new' qui ne rompt pas' instanceof' http://js-bits.blogspot.com/2010/08/constructors-without-using-new.html –