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. He aquí un ejemplo:`nueva función()` con minúscula "f" en JavaScript
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 "este" se utiliza, se convierte en una propiedad pública de someObj. 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 ninguna parte. Incluso JSLint de Douglas Crockford se queja al respecto:
- construcción raro. Eliminar 'nuevo'
Estamos utilizando esta técnica en la producción y parece estar funcionando bien, pero estoy un poco ansioso al respecto porque no está documentada en cualquier lugar. ¿Alguien sabe si esta es una técnica válida?
Prefiero tu construcción sobre el IIFE ('Función invocada inmediatamente'). 1: no necesita un objeto explícito de 'instancia', eso es exactamente lo que 'esto' es en JavaScript. 2: No necesita devolver nada, lo que significa que no necesita recordarlo. Incluso el autor de la respuesta aceptada se olvidó de devolver el objeto de instancia inicialmente. Por lo general, las personas prefieren usar un IIFE si odian lo nuevo y esto, con buena razón: si tienes una función manejando un evento DOM, 'this' se referirá al elemento que activó el evento, no a tu objeto, pero podrías tener 'var instance = this' en su lugar. –
¿Por qué es importante para la pregunta especificar "minúscula f"? – ClearCloud8
Porque en Javascript también existe la función 'Function' (con F mayúscula), que es diferente: __Function__ es una función constructora que puede crear nuevos objetos de función, mientras que __function__ es una palabra clave. –