引用javascript对象中的另一个字段

时间:2012-07-20 02:59:35

标签: javascript

我在javascript中有一个对象:

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

我有很多像这样的对象,每个对象都有一个path字段和一个link函数。我想在path中使用字段link,但我不能只使用path

我该怎么办?

5 个答案:

答案 0 :(得分:5)

您可以使用this来引用该对象。标准object.method()“点”语法会在this内将object设置为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();

演示:http://jsfiddle.net/2Pt7n/

(还有其他方法可以调用一个函数,使得this不会被设置为适当的对象,但我希望它们不适用于此 - 你真的没有说明你是如何使用的对象或调用函数,但如果不是我显示的方式,请更新您的问题,我会相应地更新我的答案。)

答案 1 :(得分:2)

我不会谈论这不是JSON(其他人也很好)。

你可以这样做以获得路径:

return admins.articles.path;

这是一个显示它工作的小提琴:http://jsfiddle.net/UwbLt/

答案 2 :(得分:1)

您展示的不是JSON。它是一个Javascript对象,它与JSON不同。 JSON是严格定义的数据序列化格式,是Javascript对象文字的子集。

Javascript不提供在对象文字中引用对等属性的语法,如您所愿。命名它们是一个想法,但它没有用,因为在定义文字时名称不存在,因此该名称不能在文字本身中使用。

另请注意,您定义的语法会使对象变为lop-sided:您可以将路径作为obj.admins.articles.path访问,但link是您必须调用的函数:obj.admins.articles.link()

答案 3 :(得分:1)

我正在阅读答案,甚至理解一些用户的观点(JSON应仅用于数据)并同意这是正确的,我刚刚创建了一个概念验证示例。看一看。

// 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"

这与nnnnnn发布的几乎相同,但我想我也会发布它,只是为了补充答案。 jsFiddle:http://jsfiddle.net/davidbuzatto/rhKAM/

所以我认为,即使与JSON的定义相矛盾,JSON也许可以(或应该具有)与使用常规对象初始化器sintax创建的对象相同的特性,因为它的名称是 JavaScript 对象表示法,而不是“轻量级”对象表示法。我知道,我知道,反序列化器无法根据目标语言反序列化函数,但为什么ExtJS支持这种“行为”?可在此处找到一个很好的讨论:Is it valid to define functions in JSON results?

只是澄清一下。我不会在我的JSON中使用(我也不会使用)函数。

答案 4 :(得分:1)

我只是指出你不想在这里使用ES6胖箭头,因为在这种情况下不会有这个指针:

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

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