我在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
。
我该怎么办?
答案 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();
(还有其他方法可以调用一个函数,使得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