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

Reference another field inside a javascript object

本文关键字:另一个 字段 javascript 对象 引用      更新时间:2023-12-13

我在javascript:中有一个对象

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

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

我该怎么办?

您可以使用this来引用对象。标准object.method()"点"语法将在method:中将this设置为object

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就不会被设置为合适的对象,但我希望它们不适用于这里——你没有真正说明你是如何使用对象或调用函数的,但如果不是我展示的方式,请更新你的问题,我会相应地更新我的答案。)

我只想指出,您不想在这里使用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()===未定义的

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

Javascript没有提供任何语法来引用对象文字中的对等属性,正如你所希望的那样。命名它们是一种想法,但它没有帮助,因为在定义文字时,名称不存在,所以名称不能用于文字本身。

此外,请注意,您定义的语法使对象倾斜:您可以访问路径作为obj.admins.articles.path,但链接是您必须调用的函数:obj.admins.articles.link()

我不会谈论这怎么不是JSON(其他人对此做了很好的介绍)。

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

return admins.articles.path;

下面是一把小提琴,展示它的工作原理:http://jsfiddle.net/UwbLt/

我正在阅读答案,甚至理解一些用户的观点(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中不使用(也不会使用)函数。