2011-07-07 18 views
7

He estado utilizando la palabra clave new en JavaScript hasta el momento. He estado leyendo sobre Object.create y me pregunto si debería usarlo en su lugar. Lo que no entiendo es que a menudo necesito ejecutar el código de construcción, así que no veo cómo va a funcionar Object.create, ya que no activa ninguna función.¿Hay alguna razón para usar Object.create() o new en JavaScript?

¿Alguien podría decirme, en cuyo caso debería usar Object.create en lugar de new?

+0

Véanse las respuestas a esta pregunta: http://stackoverflow.com/questions/4166616/understanding-the-difference-between- object-create-and-new-somefunction-in-ja –

+0

Vea esto también con todas las respuestas nuevas, http://stackoverflow.com/questions/387707/whats-the-best-way-to-define-a-class -in-javascript –

Respuesta

11

Hasta ahora, si desea crear un objeto, sólo se puede usar literales:

var obj = {}; 

o la Object constructor.

var obj = Object(); 

Pero ninguno de estos métodos le permiten especificar el prototipo del objeto creado.

Esto es lo que puede hacer ahora con Object.create. Te permite crear un nuevo objeto y establece el primer argumento como prototipo del nuevo objeto. Además, le permite establecer propiedades del nuevo objeto provisto como segundo argumento.

Es similar a hacer algo como esto (sin el segundo argumento):

function create(proto) { 
    var Constr = function(){}; 
    Constr.prototype = proto; 
    return new Constr(); 
} 

Así que si usted está utilizando una construcción similar a este, esto cuando desea utilizar Object.create.

No es un reemplazo para new. Es más una adición para simplificar la creación de objetos únicos que deberían heredar de otro objeto.

Ejemplo:

I tiene un objeto a:

var a = { 
    someFunction: function() {} 
}; 

y quiero b para extender este objeto. A continuación, puede utilizar Object.create:

b = Object.create(a); 
b.someOtherFunction = function(){}; 

Siempre que tenga una función constructora, pero sólo una instancia uno objeto de ella, es posible que pueda reemplazar esto con Object.create.

Hay una regla general que se aplica. Depende mucho de lo que haga la función de constructor y cómo herede de otros objetos, etc.

+0

Tal vez soy denso, pero todavía no entiendo cuándo usaría Object.create vs new? ¿Puedes dar un ejemplo de código del uso de Object.create y explicar por qué el nuevo no hubiera funcionado? – jfriend00

+6

@ jfriend00: Utilizaría 'Object.create' si el único propósito de una función de constructor es crear un objeto vacío que herede de otro objeto. –

+0

Eso ayuda, gracias. Me parece que es una versión soportada por el lenguaje de YUI extend() que se usa para crear un nuevo objeto que hereda el prototipo de otro objeto. ¿Está bien? – jfriend00

3

Como ya se mencionó, Object.create() se usa comúnmente cuando se quiere una manera fácil de configurar el prototipo de un nuevo objeto. Lo que las otras respuestas no mencionan, sin embargo, es que las funciones de constructor (que requieren nuevas) no son tan diferentes de cualquier otra función.

De hecho, cualquier función puede devolver un objeto, y es común en JavaScript para ver las funciones de fábrica (como constructores, pero que no requieren new, o utilizar this para referirse al nuevo objeto). Las funciones de fábrica a menudo usan Object.create() para establecer el prototipo del nuevo objeto.

var barPrototype = { 
    open: function open() { /* ... */ }, 
    close: function close() { /* ... */ }, 
}; 
function createBar() { 
    return Object.create(barPrototype); 
} 

var bar = createBar(); 
2

super tarde a este hilo .. pero creo que una distinción importante que necesita ser hecho es que mientras que los constructores son sólo funciones, el nuevo operador invoca la función y captura el objeto resultante que puede ser útil cuando se encuentra en un ambiente dinámico. También permite la referencia a propiedades y métodos durante la ejecución del constructor, que pueden o no ser útiles dependiendo de la situación. Si está más preocupado por tener un prototipo configurado pero el objeto en sí es más estático que no, Object.create sería una mejor opción, ya que es más limpio y no interfiere con la protocadena de maneras inesperadas como lo hace el nuevo operador. .

algunos ejemplos sencillos ..

var Foo = function(element) { 
    this.elem = element; 
    $(this.elem).css('color', 'blue'); 
    // using the new operator here gives access to this.elem 
    // immediately after that declaration is made, thus providing 
    // a comfortable dynamic system to work with 
} 

var bar = new Foo(someElem); 

como adosados ​​a ..

var foo = { 
    elem : element,    // assume elem exists 
    $(this.elem).css('color', 'blue')// in the lexical scope 
} 

var bar = Object.create(foo); 
// This.elem does not exist until the object is returned now 
// and the .css method call will not execute 

Debe ser un poco más claro por qué desea utilizar uno sobre el otro, como otro simple resumen .. .

uso Nuevo, cuando usted se preocupa por tener un objeto dinámico y menos sobre la cadena de prototipo

Usa Object.create cuando te importa menos ser dinámico y más acerca de tener una cadena de prototipos explícita. También observaré que los objetos creados con Object.create también se pueden construir dinámicamente utilizando un método llamado init que puede crear para asignar propiedades según sus necesidades y simplemente llamarlo a su objeto recién devuelto.

Cada enfoque tiene sus altibajos pero sus casos de uso son bastante distintos en mi opinión. Sin embargo, lo más probable es que te encuentres usando Object.create ya que la mayoría de las situaciones requieren una situación menos dinámica y más necesidad de herencia.

0

El código fuente exacta de la función Object.create() es:

function Object.Create(proto, propertiesObject) 
{ 
    var obj = {}; 

    Object.setPrototypeOf(obj, proto); 

    if(propertiesObject) 
    { 
     Object.defineProperties(obj, propertiesObject); 
    } 

    return obj; 
} 
Cuestiones relacionadas