Prefiero usar el estilo OOP funcional para mi código (similar al patrón de módulo) porque me ayuda a evitar la palabra clave "nueva" y todos los problemas con el alcance de la palabra clave "this" en devoluciones de llamada.Pregunta sobre el estilo OOP funcional en JavaScript
Pero me he encontrado con algunos problemas menores. Me gustaría utilizar el siguiente código para crear una clase.
namespace.myClass = function(){
var self = {},
somePrivateVar1;
// initialization code that would call
// private or public methods
privateMethod();
self.publicMethod(); // sorry, error here
function privateMethod(){}
self.publicMethod = function(){};
return self;
}
El problema es que no puedo llamar a los métodos públicos desde mi código de inicialización, ya que estas funciones aún no están definidas. La solución obvia sería crear un método init y llamarlo antes de la línea "return self". Pero tal vez conoces una solución más elegante?
Además, ¿cómo manejas la herencia con este patrón? Utilizo el siguiente código, pero me gustaría escuchar sus ideas y sugerencias.
namespace.myClass2 = function(){
var self = namespace.parentClass(),
somePrivateVar1;
var superMethod = self.someMethod;
self.someMethod = function(){
// example shows how to overwrite parent methods
superMethod();
};
return self;
}
Editar. Para los que preguntó cuáles son las razones para elegir este estilo de programación orientada a objetos, se puede mirar en las preguntas siguientes:
En general, es una mala idea no utilizar las técnicas dadas por un idioma. Eso significa que no debe eludir 'new', así es como se hace en Javascript y probablemente sea la mejor manera _en este idioma en particular_. –
¿Por qué no puedes simplemente definir los métodos en la parte superior, antes de intentar llamarlos? –
Gs, creo que el uso de cierres para crear objetos con miembros privados es una técnica dada por un idioma. Incluso Douglas Crockford lo defiende. También realicé algunas pruebas de rendimiento antes, y para pequeñas cantidades de objetos realmente no importa. (http://valums.com/b/) Pero para mí hace un código más limpio. –