Crockford da un ejemplo de una función de creación de objetos que deberían haber sido proporcionados por sí mismo JS en una de sus conversaciones Javascript disponibles en http://developer.yahoo.com/yui/theater/
Sin embargo, el (3) propio equipo de YUI utiliza "nuevo", y SÍ siga sus recomendaciones (ya que él es el arquitecto JS jefe de Yahoo (ACTUALIZACIÓN: siguió adelante, pero la declaración era cierta cuando esta respuesta se escribió originalmente). Entiendo que esta afirmación particular sea más en un nivel "académico", lo que DEBERÍA tener TENGO el lenguaje diseñado "correctamente" y no con algunos restos de la herencia hereditaria. Él (en mi humilde opinión) dice que la forma en que resultó JS es conflictiva, basada en prototipos pero con esto de la "clase clásica" lenguajes de herencia.
Sin embargo, JS es como es, así que ve y usa "nuevo".
Usted puede encontrar que su función de creación de objetos aquí: http://javascript.crockford.com/prototypal.html
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
newObject = Object.create(oldObject);
EDIT: Se ha actualizado para utilizar la última versión de Crockford de esa función - hay tres.
ACTUALIZACIÓN de junio de 2015: Hemos tenido Object.create(...)
durante bastante tiempo ahora, que todas las ayudas actuales navegadores (incluido IE 9 y superior.), Así que no había necesidad de utilizar la función de Crockford.
Sin embargo, resulta que si se utiliza Object.create
usted debe asegurarse de que usted no hace que una gran cantidad: Esa función es mucho más lento que usando new Constructor()
!
Consulte http://mrale.ph/blog/2014/07/30/constructor-vs-objectcreate.html para obtener una explicación (para el motor V8), y vea http://jsperf.com/object-create-vs-crockford-vs-jorge-vs-constructor/62 para obtener una demostración de rendimiento.
Otra razón para no dar la espalda a new Constructor(...)
es que ES6 classes seguramente tendrá una amplia adopción aunque solo sea por la sencilla razón de que la mayoría de los desarrolladores de Javascript provienen de idiomas basados en clases.
También puedes ver este artículo, que argumenta paraObject.create
: http://davidwalsh.name/javascript-objects-deconstruction
guste o no, especialmente en los proyectos que desea compartir con una amplia gama de personas (en el espacio y el tiempo - lo que significa derecha ni o con el tiempo, otras personas que se hagan cargo de usted) hay más razones para usar new
.
ACTUALIZACIÓN Septiembre de 2015: Para mí, he comenzado a utilizar ES 2015 Javascript para todo, usando ya sea io.js y/o Babel. Tampoco utilizo cualquieranew
en mis proyectos a excepción de los complementos de Javascript como new Error(...)
. Prefiero usar el enfoque funcional mucho más poderoso, ignoro por completo el sistema de objetos. [my-object].prototype
y this
han desaparecido por completo de mis proyectos. Durante mucho tiempo, yo era MUY escéptico de estas ideas "porque los objetos funcionan bien". Pero después de probarlo a regañadientes al comienzo de un nuevo proyecto (io.js), hizo clic y no entiendo por qué perdí dos décadas. Bien, no del todo, hoy los motores y el hardware de JS son mucho más propicios para ese estilo. Especialmente con ES 2015, recomiendo dar un estilo funcional completamente libre de cualquier this
y class
(la nueva palabra clave ES 2015 o el concepto completo, basado en el uso de constructorFn.prototype
). Puede tomarle algunas semanas, pero una vez que "haga clic" le prometo que no volverá jamás, no voluntariamente. Es mucho más conveniente y más poderoso.
ACTUALIZACIÓN Febrero de 2018: Mientras sigo haciendo lo que escribí en la actualización anterior, ahora quiero agregar que a veces las clases están bien. No hay absolutos :-)
de prototipos, prototipos, prototipos. – Oded
¿Qué argumento tiene? Tengo un proyecto completo que depende de 'nuevo' para obtener una gran oferta y me ha ayudado muchísimo organizarlo. – pimvdb
eche un vistazo a [¿Puedo construir un objeto JavaScript sin utilizar la nueva palabra clave] (http://stackoverflow.com/questions/1889014/can-i-construct-a-javascript-object-without-using-the-new -keyword) – Maxym