15 votes

Référence à un autre champ dans un objet javascript

J'ai un objet en javascript :

admins: {
    articles: {
        path: '/admins/articles',
        template: '/views/admins/articles.html',
        link: function() {
            return path;  // !!! how to reference the 'path'?
        }
    }
}

J'ai beaucoup d'objets de ce type, et chacun d'entre eux a un objet de type path et un link fonction. Je veux utiliser le champ path en link mais je ne peux pas simplement utiliser path .

Que dois-je faire ?

14voto

nnnnnn Points 70578

Vous pouvez utiliser this pour référencer l'objet. Standard object.method() La syntaxe "point" mettra this a object sur method :

var someObj = {
    admins: {
        articles: {
            path: '/admins/articles',
            template: '/views/admins/articles.html',
            link: function() {
                return this.path; // !!! how to reference the 'path'?
            }
        }
    }
};

var returnedPath = someObj.admins.articles.link();

Démonstration : http://jsfiddle.net/2Pt7n/

(Il existe d'autres façons d'appeler une fonction telle que this ne sera pas défini sur l'objet approprié, mais j'espère qu'ils ne s'appliquent pas ici - vous ne dites pas vraiment comment vous utilisez les objets ou appelez la fonction, mais si ce n'est pas de la manière que j'ai montrée, alors mettez à jour votre question et je mettrai à jour ma réponse en conséquence).

5voto

Jeff Lowery Points 125

Je signale simplement qu'il ne faut pas utiliser la flèche de l'ES6 ici, car il n'y aura pas de ce dans ce cas :

var someObj = {
    admins: {
        articles: {
            path: '/admins/articles',
            template: '/views/admins/articles.html',
            link: () => {
                return this.path; // 'this' is undefined
            }
        }
    }
};

someObj.admins.articles.link() === undefined

2voto

Ned Batchelder Points 128913

Ce que vous montrez n'est pas JSON. C'est un objet Javascript, qui est différent de JSON. JSON est un format de sérialisation de données strictement défini qui est un sous-ensemble de littéraux d'objet Javascript.

Javascript ne fournit pas de syntaxe pour référencer les propriétés des pairs dans un objet littéral, comme vous voulez le faire. Leur donner un nom est une idée, mais cela n'aidera pas, parce que le nom n'existera pas pendant que le littéral est défini, donc le nom ne sera pas disponible pour être utilisé dans le littéral lui-même.

Notez également que la syntaxe que vous définissez rend l'objet bilatéral : vous pouvez accéder à path en tant que obj.admins.articles.path mais le lien est une fonction que vous devez invoquer : obj.admins.articles.link() .

2voto

Jason L. Points 1546

Je ne vais pas expliquer en quoi ce n'est pas JSON (d'autres l'ont bien expliqué).

Vous pouvez faire cela pour obtenir le chemin :

return admins.articles.path;

Voici une manipulation pour montrer que cela fonctionne : http://jsfiddle.net/UwbLt/

1voto

davidbuzatto Points 5148

Je lis les réponses et je comprends même le point de vue de certains utilisateurs (que JSON devrait être utilisé uniquement pour les données) et je suis d'accord que c'est correct, je viens de créer un exemple de preuve de concept. Jetez-y un coup d'œil.

// just a regular object
var obj = {
    a: "aaa",
    b: "bbb",
    c: function() {
        return this.a;
    }
};

console.log( obj.c() ); // prints "aaa"

// isn't it json just because it has a function? ExtJS will treat it like JSON, but jQuery not
var json = "{" +
    "\"a\": \"aaa\", " +
    "\"b\": \"bbb\", " +
    "\"c\": function() {" +
    "    return this.a;" +
    "}" +
"}";

// ok, the "json" above
console.log( json );

//var jsonObj = $.parseJSON( json ); // does not work
//var jsonObj = eval( json ); // does not work too
var jsonObj = Ext.decode( json ); // it works! shortcut for Ext.JSON.decode

console.log( jsonObj.c() );       // prints "aaa"

C'est presque la même chose que ce que nnnnnn a posté, mais je pense que je le posterais aussi, juste pour compléter les réponses. jsFiddle : http://jsfiddle.net/davidbuzatto/rhKAM/

Je pense donc, même en contradiction avec la définition de JSON, que JSON peut (ou devrait) avoir les mêmes caractéristiques qu'un objet créé à l'aide de l'initialisateur d'objet ordinaire sintax, puisque son nom est JavaScript Notation d'objets, pas Notation d'objets "légère". Je sais, je sais, un désérialiseur ne sera pas capable de désérialiser une fonction en fonction du langage cible, mais pourquoi ExtJS supporte ce "comportement" ? Une bonne discussion peut être trouvée ici : Est-il possible de définir des fonctions dans des résultats JSON ?

Juste pour clarifier. Je n'utilise pas (et je n'utiliserai pas non plus) de fonctions dans mes JSON.

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