2010-07-12 7 views
5

Je suis relativement nouveau dans l'utilisation de oop dans Javascript, et je me demande quelle est la meilleure pratique pour les méthodes privées. En ce moment, j'utilise mootools pour créer mes classes et je simule des méthodes privées en les préfixant avec un underscore et en me forçant à ne pas appeler la méthode en dehors de la classe. Donc, ma classe ressemble à:Méthodes privées dans une classe Mootools

var Notifier = new Class(
{ 
    ... 
    showMessage: function(message) { // public method 
     ... 
    }, 

    _setElementClass: function(class) { // private method 
     ... 
    } 
}); 

Est-ce une bonne façon de gérer les méthodes privées dans JS?

Répondre

12

MooTools fournit une méthode protect sur les fonctions, de sorte que vous pouvez appeler la protection sur toute méthode que vous souhaitez protéger d'être appelée en dehors du Class. Ainsi, vous pouvez faire:

​var Notifier = new Class({ 
    showMessage: function(message) { 

    }, 
    setElementClass: function(klass) { 

    }.protect() 
})​; 

var notifier = new Notifier(); 
notifier.showMessage(); 
notifier.setElementClass(); 
> Uncaught Error: The method "setElementClass" cannot be called. 

Non pas que class est un futur mot-clé réservé en JavaScript et votre code peut se casser lorsque vous l'utilisez. Il casse certainement sur Safari à ce stade, mais le comportement dans d'autres navigateurs n'est pas garanti aussi, donc il est préférable de ne pas utiliser class comme un identificateur du tout.

L'un des avantages d'utiliser protect plutôt que de créer des fermetures est que si vous étendez cette classe, vous pouvez toujours accéder aux méthodes protégées dans les sous-classes.

Notifier.Email = new Class({ 
    Extends: Notifier, 

    sendEmail: function(recipient, message) { 
     // can call the protected method from inside the extended class 
     this.setElementClass('someClass'); 
    } 
}); 

var emailNotifier = new Notifier.Email(); 
emailNotifier.sendEmail("a", "b"); 
emailNotofier.setElementClass("someClass"); 
> Uncaught Error: The method "setElementClass" cannot be called. 

Si vous souhaitez utiliser une convention de nommage tels que Préfixez ou suffixez _ avant ou après une méthode, alors c'est parfaitement bien aussi. Ou vous pouvez combiner le _ avec les méthodes protégées aussi.

+0

C'est exactement ce que je cherchais, merci beaucoup! Je vais devoir vérifier les documents mootools la prochaine fois. – aubreyrhodes

2

Eh bien, tant que vous restez cohérent, vous n'aurez pas de problèmes.

Il existe cependant un motif pour créer une véritable confidentialité en javascript via fermeture.

var Notifier = function() { 

    // private method 
    function setElementClass(class) { 
     //... 
    } 

    // public method 
    this.showMessage = function(message) { 
     // ... 
     setElementClass(...) // makes sense here 
    }; 
}; 

var noti = new Notifier(); 
noti.showMessage("something");  // runs just fine 
noti.setElementClass("smth else"); // ERROR: there isn't such a method 

Si vous voulez ajouter des méthodes publiques héritées et partagées entre tous les objets (plus petite empreinte mémoire), vous devez les ajouter au prototype de l'objet.

// another way to define public functions 
// only one will be created for the object 
// instances share this function 
// it can also be used by child objects 
// the current instance is accessed via 'this' 
Notifier.prototype.showMessage = function() { 
    // ... 
    this.otherPublicFunction(...); 
};​ 

je vous recommande de regarder dans la façon brute de la manipulation d'objets en javascript, parce que vous serez en mesure de savoir ce que vous faites. Mootools like classes serait bon de cacher ce que ce langage diffère des autres. Mais la vérité est qu'il diffère tellement qu'il serait naïf de penser que vous faites la même chose quand vous dites class en javascript, comme dans toute autre langue OO basée sur la classe.

Questions connexes