Mi colega ha estado usando "nueva función ()" con una "f" minúscula 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:
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 utiliza "this", se convierte en propiedad pública de someObj. Así que someObj.foo, someObj.get_inner () y someObj.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 "inner" mediante cierres.
Sin embargo, no he visto ninguna referencia a esta técnica en ninguna parte. Incluso JSLint de Douglas Crockford se queja de ello:
- construcción extraña. Eliminar 'nuevo'
Estamos usando esta técnica en producción y parece que funciona bien, pero estoy un poco ansioso porque no está documentado en ninguna parte. ¿Alguien sabe si esta es una técnica válida?
fuente
this
se referirá al elemento que disparó el evento, no a su objeto, pero podría tener en suvar instance = this
lugar.Respuestas:
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 punto de usar el
new
operador de esa manera:El propósito del
new
operador es crear nuevas instancias de objetos, configurando la[[Prototype]]
propiedad interna, puede ver cómo esto lo hace la[Construct]
propiedad interna.El código anterior producirá un resultado equivalente.
fuente
function foo () {}
devuelve el resultado de crear unFunction
objeto [presumiblemente con new Function ()]. Es azúcar de sintaxis.return instance;
al final. De lo contrario,someObj
solo seráundefined
. :-)=
Su código es similar a la construcción menos extraña
fuente
Para aclarar algunos aspectos y hacer que JSLint de Douglas Crockford no se queje de su código aquí hay algunos ejemplos de instanciación:
En el ejemplo 3. la expresión en (...) como valor es una función / constructor. Tiene este aspecto: 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 parece al ejemplo 4.
JSLint de Douglas Crockford "piensa" que desea asignar la función a someObj, no a su instancia. Y después de todo, es solo una advertencia, no un error.
fuente