Miré a talk by Douglas Crockford on the good parts in Javascript y mis ojos se abrieron. En un momento dijo, algo así como, "Javascript es el único lenguaje en el que los buenos programadores creen que pueden usarlo efectivamente, sin aprenderlo". Entonces me di cuenta, Soy ese tipo.OO patrón de constructor de Javascript: neoclásico vs prototipal
En esa charla, hizo algunas declaraciones que, para mí, fueron bastante sorprendentes y perspicaces. Por ejemplo, JavaScript es el lenguaje de programación más importante del planeta. O es el idioma más popular en el planeta. Y, que está roto de muchas maneras serias.
La declaración más sorprendente que hizo, para mí, fue "nuevo es peligroso". Él no lo usa más. Él no usa this
tampoco.
Presentó un patrón interesante para un constructor en Javascript, uno que permite las variables de miembros públicos y privados, y no se basa en new
ni en this
. Se ve así:
// neo-classical constructor
var container = function(initialParam) {
var instance = {}; // empty object
// private members
var privateField_Value = 0;
var privateField_Name = "default";
var privateMethod_M1 = function (a,b,c) {
// arbitrary
};
// initialParam is optional
if (typeof initialParam !== "undefined") {
privateField_Name= initialParam;
}
// public members
instance.publicMethod = function(a, b, c) {
// because of closures,
// can call private methods or
// access private fields here.
};
instance.setValue = function(v) {
privateField_Value = v;
};
instance.toString = function(){
return "container(v='" + privateField_Value + "', n='" + privateField_Name + "')";
};
return instance;
}
// usage
var a = container("Wallaby");
WScript.echo(a.toString());
a.setValue(42);
WScript.echo(a.toString());
var b = container();
WScript.echo(b.toString());
EDITAR: código actualizado para cambiar al nombre de la clase en minúsculas.
Este patrón ha evolucionado desde Crockford's earlier usage models.
Pregunta: ¿Utiliza este tipo de patrón de constructor? ¿Lo encuentras comprensible? ¿Tienes uno mejor?
Genius ... ¡menos como un constructor, más como una fábrica! – Zoidberg
Asegúrese de protegerse contra el uso como var c = new Container() ;, que podría implicar el control del valor de esto. –
Estoy de acuerdo con @Kevin Hakanson, Douglas Crockford realmente recomienda utilizar una inicial en minúscula para este tipo de método, y una inicial en mayúscula para los métodos de construcción destinados a ser utilizados con los nuevos. –