Je veux créer un objet javascript, dont la valeur de "C" copie la valeur de "A":

var obj={
  'A':'some complex function returns a string',
  'C':obj['A']
};

Mais il contient des erreurs. J'essaie de vérifier si la clé 'A' a vraiment été créée:

var f=function(str){
  console.log(str);
  return str;
};
var obj={
  [f('A')]:[f('B')],
  "C":obj['A']
};

Qui imprime

B
A

Puis des erreurs. Ce qui signifie que «A» a été créé, mais il indique toujours que obj [«A»] n'est pas défini. Pourquoi cela arriverait-il?

0
ocomfd 13 avril 2018 à 09:22

3 réponses

Meilleure réponse

Votre tentative actuelle échoue évidemment car au moment où le code construit un nouvel objet, la valeur de la variable obj n'était pas encore affectée.

Vous pouvez le vérifier en utilisant

var obj = { C: typeof obj}

Je veux créer un objet javascript, dont la valeur de "C" copie la valeur de "A"

Si vous souhaitez que C reflète toujours la valeur de A, vous pouvez utiliser

var obj = {
  A: 'Some value',
  get C() {
    return this.A;
  }
}

Ou fractionner la déclaration obj

var obj = { A: 'Some Value' };
obj.C = obj.A
1
Yury Tarabanko 13 avril 2018 à 06:31

Vous obtenez l'erreur car obj n'était pas encore défini lorsque vous avez tenté d'y accéder depuis l'intérieur.

Pour faire fonctionner votre code, vous pouvez utiliser un getter.

La syntaxe get lie une propriété d'objet à une fonction qui sera appelé lorsque cette propriété est recherchée. - https://developer.mozilla.org/en -US / docs / Web / JavaScript / Référence / Fonctions / get

De plus, vous n'avez pas besoin de guillemets pour vos propriétés d'objet.

Les guillemets peuvent être omis si le nom de la propriété est un littéral numérique ou un identifiant valide.

var obj = {
  A : 'Hello',
  get C() {
    return this.A;
  }
};

console.log(obj.C);
0
Cata John 13 avril 2018 à 06:31

Vous ne pouvez pas référencer une variable qui n'a pas encore été créée. Vous pouvez le faire comme ça.

var obj = { 'A' : 'some complex function returns a string' }
obj['C'] = obj['A'] 
0
ymutlu 13 avril 2018 à 08:18