Crockford ha hecho mucho para popularizar buenas técnicas de JavaScript. Su postura obstinada sobre los elementos clave del lenguaje ha provocado muchas discusiones útiles. Dicho esto, hay demasiadas personas que toman cada proclamación de "malo" o "dañino" como un evangelio, y se niegan a mirar más allá de la opinión de un hombre. Puede ser un poco frustrante a veces.
El uso de la funcionalidad proporcionada por la new
palabra clave tiene varias ventajas sobre la construcción de cada objeto desde cero:
- Prototipo de herencia . Aunque a menudo se observa con una mezcla de sospecha y burla por parte de aquellos acostumbrados a los lenguajes de OO basados en clases, la técnica de herencia nativa de JavaScript es un medio simple y sorprendentemente efectivo de reutilización de código. Y la nueva palabra clave es el medio canónico (y solo disponible multiplataforma) para usarlo.
- Actuación. Este es un efecto secundario del n. ° 1: si quiero agregar 10 métodos a cada objeto que creo, podría escribir una función de creación que asigne manualmente cada método a cada nuevo objeto ... O podría asignarlos al funciones de creación
prototype
y uso new
para estampar nuevos objetos. Esto no solo es más rápido (no se necesita código para todos y cada uno de los métodos del prototipo), sino que también evita que cada objeto tenga globos con propiedades separadas para cada método. En máquinas más lentas (o especialmente, intérpretes JS más lentos) cuando se crean muchos objetos, esto puede significar un ahorro significativo de tiempo y memoria.
Y sí, new
tiene una desventaja crucial, descrita hábilmente por otras respuestas: si olvida usarlo, su código se romperá sin previo aviso. Afortunadamente, esa desventaja se mitiga fácilmente: simplemente agregue un poco de código a la función en sí:
function foo()
{
// if user accidentally omits the new keyword, this will
// silently correct the problem...
if ( !(this instanceof foo) )
return new foo();
// constructor logic follows...
}
Ahora puede tener las ventajas de new
sin tener que preocuparse por los problemas causados por un mal uso accidental. Incluso podría agregar una afirmación al cheque si la idea de que el código roto funcione silenciosamente le molesta. O, como algunos comentaron, use la verificación para introducir una excepción de tiempo de ejecución:
if ( !(this instanceof arguments.callee) )
throw new Error("Constructor called as a function");
(Tenga en cuenta que este fragmento puede evitar codificar el nombre de la función del constructor, ya que, a diferencia del ejemplo anterior, no tiene necesidad de crear una instancia del objeto; por lo tanto, se puede copiar en cada función de destino sin modificación).
John Resig entra en detalles sobre esta técnica en su publicación de instanciación de "Clase" Simple , así como también incluye un medio para construir este comportamiento en sus "clases" de forma predeterminada. Definitivamente vale la pena leer ... al igual que su próximo libro, Secretos del JavaScript Ninja , que encuentra el oro oculto en esto y muchos otros "perjudicial" características del lenguaje JavaScript (el capítulo en with
que se alumbra en especial para aquellos de nosotros que inicialmente rechazó esta característica muy difamada como un truco).