916 votes

Des références dans les déclarations littéral d’objet

Est-il possible d’obtenir quelque chose comme ce qui suit pour travailler en JavaScript ?

Dans sa forme actuelle, copiez le code suivant lève évidemment une erreur de référence depuis ne fait pas référence à . Mais est il possible d’avoir des valeurs dans les propriétés d’un objet littéral dépendent d’autres propriétés déclarées précédemment ?

1015voto

CMS Points 315406

Eh bien, la seule chose que je peux vous parler sont des accesseurs get :

Il s’agit d’une extension syntaxique introduite par la spécification de version d’ECMAScript 5, la syntaxe est pris en charge par la plupart des navigateurs modernes (y compris IE9).

352voto

Felix Kling Points 247451

Vous pourriez faire quelque chose comme :

Ce serait une sorte d’une initialisation de l’objet.

Notez que vous assignez en fait la valeur de retour de à , par conséquent vous devez `` .

227voto

T.J. Crowder Points 285826

À l'évidence, la réponse simple est manquant, donc pour l'exhaustivité:

Mais est - il possible d'avoir des valeurs dans un objet littéral propriétés dépendent d'autres propriétés déclaré plus tôt?

Pas de. Toutes les solutions ici la reporter jusqu'à après la création de l'objet (de diverses manières) et ensuite affecter la troisième propriété. La plus simple façon est de simplement faire ceci:

var foo = {
    a: 5,
    b: 6
};
foo.c = foo.a + foo.b;

Tous les autres sont un peu plus indirecte façons de faire la même chose. (Felix est particulièrement habile, mais nécessite la création et la destruction d'un temporaire de fonction, en ajoutant de la complexité; et soit des feuilles supplémentaires de la propriété sur l'objet ou [si vous delete cette propriété] une incidence sur les performances de la suite accès à la propriété sur cet objet.)

Si vous en avez besoin pour tous dans une expression, vous pouvez le faire sans le temporaire de la propriété:

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

Ou bien, si vous avez besoin de faire plus d'une fois:

function buildFoo(a, b) {
    var o = {a: a, b: b};
    o.c = o.a + o.b;
    return o;
}

alors où vous en avez besoin pour l'utiliser:

var foo = buildFoo(5, 6);

70voto

zzzzBov Points 62084

Tout simplement instancier une fonction anonyme :

27voto

Henry Wrightson Points 81

Certains de fermeture devrait traiter ce;

var foo = function() {
    var a = 5;
    var b = 6;
    var c = a + b;

    return {
        a: a,
        b: b,
        c: c
    }
}();

Toutes les variables déclarées dans foo sont privées d' foo, que vous attendez avec toute déclaration de fonction et parce qu'ils sont tous dans le champ d'application, ils ont tous accès à l'autre sans avoir besoin de se référer à l' this, comme vous pouvez attendre d'une fonction. La différence est que cette fonction renvoie un objet qui expose les variables privées et attribue à cet objet d' foo. En fin de compte, vous revenez juste l'interface que vous souhaitez exposer comme un objet avec l' return {} déclaration.

La fonction est alors exécuté à la fin avec l' () ce qui provoque la totalité de l'objet foo être évaluées, toutes les variables à l'intérieur de instancié et le retour de l'objet ajouté en tant que propriétés de l' foo().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X