new - `nueva función()` con minúscula "f" en JavaScript
new object javascript (3)
Mi colega ha estado usando "nueva función ()" con una minúscula "f" para definir nuevos objetos en JavaScript. Parece funcionar bien en todos los navegadores principales y también parece ser bastante eficaz para ocultar variables privadas. Aquí hay un ejemplo:
var someObj = new function () {
var inner = ''some value'';
this.foo = ''blah'';
this.get_inner = function () {
return inner;
};
this.set_inner = function (s) {
inner = s;
};
};
Tan pronto como se usa "this", se convierte en propiedad pública de algún Obj. Así que algunosObj.foo, algunosObj.get_inner () y algunosObj.set_inner () están todos disponibles públicamente. Además, set_inner () y get_inner () son métodos privilegiados, por lo que tienen acceso a cierres "internos".
Sin embargo, no he visto ninguna referencia a esta técnica en ningún lado. Incluso JSLint de Douglas Crockford se queja de ello:
- construcción extraña Eliminar ''nuevo''
Estamos utilizando esta técnica en producción y parece funcionar bien, pero estoy un poco ansioso porque no está documentado en ninguna parte. ¿Alguien sabe si esta es una técnica válida?
He visto esa técnica antes, es válida, estás usando una expresión de función como si fuera una Función de Constructor .
Pero en mi humilde opinión, puede lograr lo mismo con una expresión de función de invocación automática, realmente no veo el sentido de usar el new
operador de esa manera:
var someObj = (function () {
var instance = {},
inner = ''some value'';
instance.foo = ''blah'';
instance.get_inner = function () {
return inner;
};
instance.set_inner = function (s) {
inner = s;
};
return instance;
})();
El objetivo del new
operador es crear nuevas instancias de objeto, configurar la propiedad interna [[Prototype]]
; puede ver cómo lo hace la propiedad interna [Construct]
.
El código anterior producirá un resultado equivalente.
Para aclarar algunos aspectos y hacer que JSLint de Douglas Crockford no se queje de su código aquí hay algunos ejemplos de ejemplificación:
1. o = new Object(); // normal call of a constructor
2. o = new Object; // accepted call of a constructor
3. var someObj = new (function () {
var inner = ''some value'';
this.foo = ''blah'';
this.get_inner = function () {
return inner;
};
this.set_inner = function (s) {
inner = s;
};
})(); // normal call of a constructor
4. var someObj = new (function () {
var inner = ''some value'';
this.foo = ''blah'';
this.get_inner = function () {
return inner;
};
this.set_inner = function (s) {
inner = s;
};
}); // accepted call of a constructor
En el ejemplo 3. expresión en (...) como valor es una función / constructor. Se ve así: new (function () {...}) (). Entonces, si omitimos los corchetes finales como en el ejemplo 2, la expresión sigue siendo una llamada de constructor válida y se ve como el ejemplo 4.
JSLint de Douglas Crockford "piensa" que quería asignar la función a algún Obj, no a su instancia. Y, después de todo, es solo una advertencia, no un error.
Tu código es similar a la construcción menos extraña
function Foo () {
var inner = ''some value'';
this.foo = ''blah'';
...
};
var someObj = new Foo;