2010-07-12 20 views
5

Soy relativamente nuevo en el uso de oop en Javascript, y me pregunto cuál es la mejor práctica para los métodos privados. En este momento, estoy usando mootools para crear mis clases y estoy simulando métodos privados, prefijándolos con un guión bajo y forzándome a no llamar al método fuera de la clase. Así que mi clase se parece a:Métodos privados en una clase de Mootools

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

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

¿Es esta una manera buena/estándar para manejar los métodos privados en JS?

Respuesta

12

MooTools proporciona un método protect sobre las funciones, por lo que puede llamar al método Class para proteger contra cualquier método que desee proteger. Por lo que puede hacer:

​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. 

No es que class es un futuro palabra clave reservada en JavaScript y su código puede romper cuando se la usa. Ciertamente se rompe en Safari en este punto, pero el comportamiento en otros navegadores tampoco está garantizado, por lo que es mejor no usar class como identificador.

Una ventaja del uso de protect sobre la creación de cierres es que si extiende esta clase, puede acceder a los métodos protegidos en subclases.

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 desea utilizar una convención de nombres tales como prefijo o sufijo _ antes o después de un método, entonces eso es perfectamente bien también. O puede combinar el _ con los métodos protegidos también.

+0

Esto es exactamente lo que estaba buscando, ¡muchas gracias! Tendré que volver a verificar los documentos mootools la próxima vez. – aubreyrhodes

2

Bueno, siempre y cuando seas constante no te meterás en problemas.

Hay un patrón, sin embargo, para crear una verdadera privacidad en javascript a través de cierre.

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 desea agregar métodos públicos que se heredan y comparten entre todos los objetos (menor consumo de memoria), se debe añadir a prototipo del objeto.

// 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(...); 
};​ 

recomiendo que investigue la forma cruda de la manipulación de objetos en JavaScript, porque sólo entonces será capaz de saber lo que está haciendo. Las clases de Mootools serían buenas para ocultar lo que este lenguaje difiere de los demás. Pero la verdad es que difiere tanto que sería ingenuo pensar que haces lo mismo cuando dices class en javascript, como en cualquier otro lenguaje OO basado en clases.

Cuestiones relacionadas