2010-05-17 19 views
6

Vi la presentación de Best Practices in JavaScript Library Design de John Resig; una diapositiva sugería "ajustar" el constructor del objeto para que se creara una instancia.¿Es bueno o malo envolverse en el constructor?

function jQuery(str, con) { 
    if (window === this) { 
     return new jQuery(str, con); 
    } 
    // ... 
} 

Con eso, se convierte en new jQuery("#foo")jQuery("#foo").

Pensé que era bastante interesante, pero no he escrito un constructor como ese en mi propio código.

Un poco más tarde, leí una publicación aquí en SO. (Perdón, no recuerdo cuál o yo proporcionaría un enlace. Actualizaré la pregunta si puedo encontrarla de nuevo.) Uno de los comentarios decía que era una mala práctica esconder new del programador de esa manera, pero no lo hice. entrar en detalles

Mi pregunta es, ¿se considera que lo anterior es bueno, malo o indiferente, y por qué?

Respuesta

5

Esta es una técnica defensiva para cuando la gente olvida para usar el operador new frente a una función 'clase'.
La lógica es que si se llama a la función sin new, entonces el alcance global seguirá siendo el alcance actual (en lugar de las nuevas instancias), por lo que solo llamamos a la misma función utilizando el operador new.

Pero si me preguntan, lo correcto sería arrojar un error y dejar que el desarrollador sepa que se ha cometido un error en lugar de simplemente 'aceptarlo'.

Pero bueno, supongo que es de acuerdo con el mantra jQuery:
'en lugar de permitir a los usuarios escribir código de calidad, habilitarlos/forzarlos a escribir código ilógico y no válido'.

1

Está volviendo un objeto de una función. No veo ningún problema en eso.

Es lo mismo que hacer:

function getObject(){ return new SomeObject; } 

La única diferencia es que en realidad se está devolviendo a sí mismo. Pero, en realidad, no parece engañoso si lo documenta claramente. Las personas que están acostumbradas a jQuery probablemente te elogien por el aumento de usabilidad.

4

IMO Creo que es una técnica defensiva práctica y completamente válida.

Si usted está construyendo una constructor function, para asegurarse de que desee utilizar la instancia del objeto recién creado (this), y nada bueno ocurrirá si this puntos al objeto global.

Afortunadamente, en el futuro, en la edición de ECMAScript 5 en modo estricto, se this contener simplemente undefined cuando una función es llamada con ningún objeto de base ni el operador new ...

Consulte también:

Cuestiones relacionadas