Ich weiß, dass ich ein Array von JS-Objekten wie folgt initiieren kann:

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

Ich würde diese "anonymen" Typen wohl nennen (sorry, ich verwende die Sprache C # /. NET).

Was ist, wenn ich möchte, dass diese vom selben Prototyp sind? Also habe ich einen Konstruktor definiert:

var Thing = function Thing() {
};

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

Jetzt möchte ich, dass beide Elemente in meinem ursprünglichen Code oben Thing s sind. Gibt es eine gute Möglichkeit, dies zu tun?

Wenn ich raten würde, würde ich vielleicht so etwas sagen wie:

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

Dies ist im Grunde die Syntax des C # -Objektinitialisierers. Was ich zu vermeiden versuche ist:

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

Bearbeiten:

Ich sollte auch beachten, dass meine Prototypen auch einige Funktionen enthalten, die gemeinsam genutzt werden. Auch in Wirklichkeit habe ich Arrays 3 tief verschachtelt, so ist es eher wie:

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

Aus diesem Grund hoffe ich, einfach alles so inline zu initiieren und nicht jede Eigenschaft zeilenweise festzulegen.

17
CodingWithSpike 8 Okt. 2012 im 03:44

4 Antworten

Beste Antwort
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'
  }),
];
13
Alcides Queiroz Aguiar 7 Okt. 2012 im 23:52

Sie verwenden Ihren 'Konstruktor' nicht. Es wird bevorzugt, Werte in Ihrem Konstruktor zu initialisieren:

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

Und dann mache:

var thing1 = new Thing("foo", "bar");
var thing2 = new Thing("foo", "bar");
11
Sidharth Mudgal 8 Okt. 2012 im 22:06

In diesen Fällen füge ich dem Objekt eine "config" -Methode hinzu:

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'
    })
];
1
A. Matías Quezada 8 Okt. 2012 im 00:41

Folgendes könnte funktionieren. Möchten Sie dies auch vermeiden?

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

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

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

Eine andere Sache, an die ich denken kann, ist, den Konstruktor selbst zu erstellen, damit er Folgendes ermöglicht:

var things = [
    new Thing({
        prop1: "foo",
        prop2: "bar"
    }),
    new Thing({
        prop1: "foo",
        prop2: "bar"
    })
];
0
jeremy 7 Okt. 2012 im 23:47