2012-10-07 12 views
16

Sé que puedo init una matriz de objetos JS así:¿Es una buena forma de iniciar una matriz de objetos de JavaScript y sus propiedades?

var things = [ 
    { 
    prop1: 'foo', 
    prop2: 'bar' 
    }, 
    { 
    prop1: 'foo', 
    prop2: 'bar' 
    } 
]; 

supongo que yo llamaría estos tipos anónimos '' (lo siento, estoy usando C#/NET.).

¿Qué sucede si quiero que estos sean del mismo prototipo? Así que he definido un constructor:

var Thing = function Thing() { 
}; 

Thing.prototype.prop1 = 'default value'; 
Thing.prototype.prop2 = 'default value'; 

Ahora quiero tanto los artículos en mi código original anterior a ser Thing s. ¿Existe una forma correcta de hacer esto?

Si tuviera que adivinar, diría que tal vez algo como:

var things = [ 
    new Thing() { 
    prop1: 'foo', 
    prop2: 'bar' 
    }, 
    new Thing() { 
    prop1: 'foo', 
    prop2: 'bar' 
    } 
]; 

que es básicamente sintaxis de C# inicializador de objeto. Lo que estoy tratando de evitar es:

var thing1 = new Thing(); 
thing1.prop1 = 'foo'; 
thing1.prop2 = 'bar'; 
var thing2 = new Thing(); 
thing2.prop1 = 'foo'; 
thing2.prop2 = 'bar'; 
var things = [thing1, thing2]; 

Editar:

También debo señalar que mis prototipos también contienen algunas funciones que son compartidos. También en la actualidad he matrices anidadas 3 de profundidad, por lo que es algo más como:

{ 
    [ 
    { 
     [ 
     {}, 
     {} 
     ] 
    }, 
    { 
     [ 
     {}, 
     {} 
     ] 
    } 
    ] 
} 

que es por lo que la esperanza de que todo acaba de init en línea como esta y no establecer cada línea hotel en la línea.

Respuesta

13
var Thing = function(params) { 
    this.prop1 = params.prop1; 
    this.prop2 = params.prop2; 
}; 

var things = [ 
    new Thing({ 
    prop1: 'foo', 
    prop2: 'bar' 
    }), 
    new Thing({ 
    prop1: 'foo', 
    prop2: 'bar' 
    }), 
]; 
+2

Marcando esto como la respuesta porque funcionó mejor en mi situación. También me permitió hacer propiedades opcionales, como: 'function Thing (params) {this.name = params.hasOwnProperty (" name ")? params.name: "algunos valores predeterminados"; } ' – CodingWithSpike

0

Lo siguiente puede funcionar, ¿es esto algo que también querría evitar?

var thing1 = new Thing(); 
var thing2 = new Thing(); 

thing1.prototype = { 
    prop1: "foo", 
    prop2: "bar" 
}; 

thing2.prototype = { 
    prop1: "foo", 
    prop2: "bar" 
}; 

Otra cosa que se me ocurre es hacer el constructor a sí mismo por lo que permite que algo como lo siguiente:

var things = [ 
    new Thing({ 
     prop1: "foo", 
     prop2: "bar" 
    }), 
    new Thing({ 
     prop1: "foo", 
     prop2: "bar" 
    }) 
]; 
+0

Eso es un poco extraño. – JoshRagem

+1

¿No cambiaría eso el prototipo en el que se basa cada instancia de objeto? El prototipo también tiene algunas funciones compartidas, entonces ¿no las perdería también? – CodingWithSpike

+0

@CodingWithSpike sí lo sería =/ – jeremy

11

Usted no está haciendo uso de su 'constructor'. Su preferido para inicializar los valores en su constructor:

var Thing = function Thing(prop1, prop2) { 
    this.prop1 = prop1; 
    this.prop2 = prop2; 
}; 

y luego hacer:

var thing1 = new Thing("foo", "bar"); 
var thing2 = new Thing("foo", "bar"); 
+0

Empecé por este camino, pero se pone un poco extraño porque algunas de mis propiedades también son matrices, así que termino con algo como: 'new One (" foo ", [new Two ([new Three(), new Three()]), new Two ([new Three(), new Three()])], "bar") 'que se ve feo. Creo que probablemente tengas razón. Supongo que solo estaba intentando retener los nombres de las propiedades para facilitar la lectura. – CodingWithSpike

+1

@CodingWithSpike, si tiene problemas para hacer una nueva clase, probablemente debería asegurarse de tener un caso de uso para los métodos en esa clase. De lo contrario, estará mejor con los literales de objeto y matriz. Además, es probable que sea mejor dejar grandes cantidades de datos estáticos como fuente de datos JSON. – zzzzBov

1

En estos casos que añadir un método "config" al objeto:

function Thing() { 
} 
Thing.prototype.prop1 = 'foo'; 
Thing.prototype.prop2 = 'bar'; 
Thing.prototype.config = function(data) { 
    for (var i in data) 
     if (data.hasOwnProperty(i)) 
      this[i] = data[i]; 
} 

var array = [ 
    new Thing().config({ 
     prop1: 'foobar', 
     prop2: 'barfoo' 
    }) 
]; 
+0

¿Hay alguna diferencia entre tener un' .config() 'y hacerlo en el propio constructor? 'function Thing (data) {for (var i in data) ...}' que básicamente es respuesta @alcidesqueiroz. – CodingWithSpike

+0

Bueno, la principal diferencia es que implementarlo en el constructor ejecuta la iteración sobre el objeto cada vez que creas un 'Thing', no importa si lo necesitas o no, usando el método' .config() 'que implícitamente preguntas para ello. –

+0

Además, puede agregar el método '.config()' a cualquier clase existente (pero no le recomiendo que extienda tipos nativos) –

Cuestiones relacionadas