2010-04-16 46 views
7

Soy relativamente novato en la programación orientada a objetos en JavaScript, y no estoy seguro de la "mejor" forma de definir y usar objetos en JavaScript. He visto la forma "canónica" de definir objetos y crear instancias de una nueva instancia, como se muestra a continuación.Crear nuevos objetos en JavaScript

function myObjectType(property1, propterty2) { 
    this.property1 = property1, 
    this.property2 = property2 
} 
// now create a new instance 
var myNewvariable = new myObjectType('value for property1', 'value for property2'); 

Pero he visto otras maneras de crear nuevas instancias de objetos de esta manera:

var anotherVariable = new someObjectType({ 
    property1: "Some value for this named property", 
    property2: "This is the value for property 2" 
}); 

me gusta la forma en que aparece segunda manera - el código es autodocumentado. Pero mis preguntas son:

  1. ¿Qué camino es "mejor"?

  2. ¿Puedo usar esa segunda forma de instanciar una variable de un objeto tipo que se ha definido utilizando la forma "clásico" de la definición del tipo objeto con la implícita constructor?

  3. Si quiero crear una matriz de estos objetos, ¿hay alguna otra consideración de ?

Gracias de antemano.

+2

Hubo un buen hilo acerca de esto hace unos días. http://stackoverflow.com/questions/1595611/how-to-properly-create-a-custom-object-in-javascript – lincolnk

+0

Por convención, se recomienda que la primera letra de las funciones de "objeto" esté en mayúscula. – Sydwell

Respuesta

7

Es realmente a gusto. De esta manera:

var anotherVariable = new someObjectType({ 
    property1: "Some value for this named property", 
    property2: "This is the value for property 2" 
}); 

... generalmente es mejor si hay más de 2/3 argumentos, ya que ayuda a la legibilidad y hace que sea más fácil evitar el problema argumento opcional (fn(null,null,null,123')).

Otra consideración es el rendimiento.Aprobar argumentos de la manera convencional será más rápido, pero este aumento de velocidad solo se vuelve significativo en situaciones muy sensibles al rendimiento.

¿Puedo utilizar esa segunda forma para crear una instancia de una variable de un tipo de objeto que se ha definido utilizando la forma "clásica" de definir el tipo de objeto con ese constructor implícito?

No es fácil. Si desea crear una instancia de un constructor mediante el uso de un hash en vez de pasar argumentos, y no tiene control sobre la fuente, entonces se podría "wrap" que:

var _constructor = SomeConstructorFunction; 

SomeConstructorFunction = function(hash) { 
    return new _constructor(hash.property1, hash.property2); 
}; 

no recomendaría realmente jugar con API de terceros solo por el estilo.

Si quiero crear una matriz de estos objetos, ¿hay alguna otra consideración?

¿Qué tan grande es la matriz? ¿Cuál es el arreglo para exactamente? Rendimiento valdría la pena considerar ...

1

Bueno, la segunda forma se ve bien y es útil en el caso de una "clase" que tiene muchas opciones de configuración. Sin embargo, tenga en cuenta que en realidad está construyendo otro objeto en el proceso.

Le aconsejo que lea algunos códigos de uno u otro marco de Javascript y encuentre un estilo que le guste.

1

1) Yo diría que el método # 2 es muy preferido, para mí de todos modos. El ejemplo con 2 propiedades no es tan diferente, pero lo que si se quería hacer esto:

var anotherVariable = new someObjectType({ 
    property1: "Some value for this named property", 
    property2: "This is the value for property 2" 
    //Leaving several properties out, don't want them populated 
    property8: "This is the value for property 8" 
    property9: "This is the value for property 9" 

}); 

pensar en cuántas combinaciones de sobrecargas (o hacer el seguimiento de null s) que tendría que tienen que manejar propiedades puede o no querer suministrar al objeto con el primer método. Este es un mucho más extensible y flexible.

2) Solo déjalo con un constructor en blanco, esto sería mucho más limpio para la creación de instancias.

3) Longitud/legibilidad, especialmente con más de unos pocos objetos. Mira JSON, es bastante limpio/legible, de nuevo al menos para mí, si te gusta ese estilo, la creación de matrices de tus objetos se ve muy similar a en el método n.º 2.

3

mejor manera de crear objetos de javascript es dejar de fumar usando el nuevo (al menos si se suscribe al campo Crockford)

myObjectType = function(props) { 
    // anything defined on props will be private due to the closure 

    props.privateVar = "private"; 

    // anything defined on obj will be public 
    obj = {}; 

    obj.testing = new function() { 
    alert(props.privateVar); 
    }; 

    return obj; 
}; 
instance = myObjectType({prop1: "prop"}); 

// if we want inheritance, it just means starting with the base type instead of 
// a new object 
subType = function(props) { 
    obj = myObjectType(props); 
    obj.subTypeProperty = "hello."; 

    return obj; 
}; 

Página 52 de Javascript: The Good Parts, lo recomiendo: -)

+0

Gah! 'new function() {...}' está totalmente equivocado! El uso de las funciones de fábrica/constructor está bien y es bueno, pero 'la nueva función ...' está muy mal. –

+1

@SeanMcMillan diciendo que es incorrecto es útil solo cuando traes argumentos :) –

+2

@ GôTô: Aceptable. 'new function() {...}' creará un nuevo objeto derivado del prototipo de la función anónima y usará la función anónima para inicializarlo. Terminas instanciando un objeto que no necesitas. Esto honestamente parece un error tipográfico para mí. De cualquier forma, 'obj.testing' será un objeto, no una función, y la alerta se ejecutará en la creación, no como un método. La instanciación de una función anónima 'nueva' es totalmente redundante con solo asignar un nuevo objeto (' {} '). –

Cuestiones relacionadas