918 Stimmen

Selbstreferenzen in Objektliteralen/Initialisierern

Gibt es eine Möglichkeit, so etwas wie das Folgende in JavaScript zum Laufen zu bringen?

var foo = {
    a: 5,
    b: 6,
    c: this.a + this.b  // Doesn't work
};

In der aktuellen Form führt dieser Code offensichtlich zu einem Referenzfehler, da this bezieht sich nicht auf foo . Aber ist Gibt es eine Möglichkeit, die Werte in den Eigenschaften eines Objektliterales von anderen, früher deklarierten Eigenschaften abhängig zu machen?

6voto

ken Punkte 3528

Es gibt verschiedene Möglichkeiten, dies zu erreichen; ich würde die folgende verwenden:

function Obj() {
 this.a = 5;
 this.b = this.a + 1;
 // return this; // commented out because this happens automatically
}

var o = new Obj();
o.b; // === 6

6voto

AnthumChris Punkte 6798

があります。 get Eigenschaft funktioniert hervorragend, und Sie können auch eine gebundene Schließung für "teure" Funktionen verwenden, die nur einmal ausgeführt werden sollen (dies funktioniert nur mit var , nicht mit const ou let )

var info = {
  address: (function() {
    return databaseLookup(this.id)
  }).bind(info)(),

  get fullName() {
    console.log('computing fullName...')
    return `${this.first} ${this.last}`
  },

  id: '555-22-9999',
  first: 'First',
  last: 'Last',
}

function databaseLookup() {
  console.log('fetching address from remote server (runs once)...')
  return Promise.resolve(`22 Main St, City, Country`)
}

// test
(async () => {
  console.log(info.fullName)
  console.log(info.fullName)
  console.log(await info.address)
  console.log(await info.address)
  console.log(await info.address)
  console.log(await info.address)
})()

5voto

Rick O'Shea Punkte 1291

Das Erstellen einer neuen Funktion für Ihr Objektliteral und das Aufrufen eines Konstruktors scheint eine radikale Abkehr vom ursprünglichen Problem zu sein und ist unnötig.

Sie können während der Initialisierung des Objektliterales nicht auf eine Geschwistereigenschaft verweisen.

var x = { a: 1, b: 2, c: a + b } // not defined 
var y = { a: 1, b: 2, c: y.a + y.b } // not defined 

Es folgt die einfachste Lösung für berechnete Eigenschaften (kein Heap, keine Funktionen, kein Konstruktor):

var x = { a: 1, b: 2 };

x.c = x.a + x.b; // apply computed property

5voto

Jamesfo Punkte 446

Nur zur Belustigung aller:

var foo = (                        (This={
    a: 5,
    b: 6,                          })=>({...This,
    c: This.a + This.b             }))(
);

console.log(foo);

4voto

Indiana Punkte 193

Ich verwende den folgenden Code als Alternative, und es funktioniert. Und die Variable kann auch ein Array sein. (@ Fausto R.)

var foo = {
  a: 5,
  b: 6,
  c: function() {
    return this.a + this.b;
  },

  d: [10,20,30],
  e: function(x) {
    this.d.push(x);
    return this.d;
  }
};
foo.c(); // 11
foo.e(40); // foo.d = [10,20,30,40]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X