13

我在 javascript 中有一个对象:

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

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

我应该怎么办?

4

5 回答 5

12

您可以使用this来引用对象。标准的object.method()“点”语法将设置thisobjectwithin 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不会设置为适当对象的函数,但我希望它们在这里不适用——你并没有真正说出你是如何使用对象或调用函数的,但是如果不是我展示的方式那么请更新你的问题,我会相应地更新我的答案。)

于 2012-07-20T03:23:00.970 回答
5

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

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

someObj.admins.articles.link() === 未定义

于 2018-02-03T05:27:10.837 回答
2

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

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

另外,请注意您定义的语法使对象不平衡:您可以访问 path as obj.admins.articles.path,但 link 是您必须调用的函数:obj.admins.articles.link()

于 2012-07-20T03:02:28.953 回答
2

我不会谈论这不是 JSON(其他人很好地涵盖了它)。

你可以这样做来获取路径:

return admins.articles.path;

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

于 2012-07-20T03:12:15.110 回答
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 支持这种“行为”?可以在这里找到一个很好的讨论:在 JSON 结果中定义函数是否有效?

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

于 2012-07-20T03:30:38.147 回答