Javascript 如何引用包含的对象?
我需要参考Javascript 如何引用包含的对象?,javascript,Javascript,我需要参考A.ns。我希望能做到: this.ns 从带有的A访问ns,但不起作用 var SStorage = FOO.support({ Name: 'SStorage', // non functions A: { storage: null, ns: 'FOO_', len: null, // should hold the length of the s
A.ns
。我希望能做到:
this.ns
从带有的A
访问ns
,但不起作用
var SStorage = FOO.support({
Name: 'SStorage',
// non functions
A: {
storage: null,
ns: 'FOO_',
len: null, // should hold the length of the string in ns:
indicator: 'FOO_h_token'
},
我得到了错误
这没有定义
从A.中的with,您不能以现有的数据结构类型引用包含对象。同样,在像您这样的静态声明中,您也不能引用同级属性 您可以在更高级别定义字符串,然后在以下两个位置引用它:
var strData = 'FOO_';
var SStorage = FOO.support({
Name: 'SStorage',
// non functions
A: {
storage: null,
ns: strData,
len: strData.length,
indicator: 'FOO_h_token'
},
var SStorage = FOO.support({
Name: 'SStorage',
// non functions
A: {
storage: null,
ns: 'FOO_',
indicator: 'FOO_h_token'
},
});
FOO.support = function(obj) {
var nsLen = obj.A.ns.length;
// now you have the length cached locally without requiring the caller
// to do extra work
}
您可能还想知道,当调用方可以随时从传入的字符串中检索长度时,为什么要传递长度。它不需要单独通过 实际上,我建议您从数据结构中完全消除长度,如果您想要一种简短的方法来引用它,那么在
FOO.support()
的实现中将其放入局部变量中,如下所示:
var strData = 'FOO_';
var SStorage = FOO.support({
Name: 'SStorage',
// non functions
A: {
storage: null,
ns: strData,
len: strData.length,
indicator: 'FOO_h_token'
},
var SStorage = FOO.support({
Name: 'SStorage',
// non functions
A: {
storage: null,
ns: 'FOO_',
indicator: 'FOO_h_token'
},
});
FOO.support = function(obj) {
var nsLen = obj.A.ns.length;
// now you have the length cached locally without requiring the caller
// to do extra work
}
为此,您需要使用方法:
A: {
storage: null,
ns: 'FOO_',
indicator: 'FOO_h_token',
len: function(){ return this.ns.length; }
}
你当然会称之为
A.len();
但是,正如jfriend00所指出的,如果这真的是你所需要的,那么就完全抛弃len,去做吧
A.ns.length;
另一个答案很好,但不要忘记显而易见的
var SStorage = FOO.support({
Name: 'SStorage',
// non functions
A: {
storage: null,
ns: 'FOO_',
len: 'FOO_'.length, // should hold the length of the string in ns:
indicator: 'FOO_h_token'
},
您可以使用js
get操作符
,实现“属性作为函数”的效果:
现在您可以将其用作普通属性:
A.len
始终是实际的
这里有更多的细节:当你说“从中到中”是什么意思?
A
有方法吗?我在不同的方法中使用了length属性,并希望有一个地方可以访问它。缩短查找链<代码>食物长度vs.长度。。。。类似于在for循环中执行length=obj.length
的原因。@pure_code.com-最好在FOO.support()
的开头添加一行代码,将长度加载到局部变量中,这样您就有一个地方可以使用较短的查找链访问它。然后,整个问题就消失了,优化代码的负担不在调用方身上,而是在函数实现中完成一次。@pure_code.com-我添加了第二个选项,将长度优化放入FOO.support()中
函数。为什么要为某个属性直接使用a.ns.length
的方法?@jfriend00-true。我不知道他剩下的代码是什么样子的,但是如果他真的需要得到ns的长度,那么是的,A.ns.length将是最好的。通常,重复相同的常量多次是不好的做法。与之相反,如果两者不总是同时更改,则会设置一个维护问题。我假设“FOO_”不是一个真正的干巴巴的引用,只是为了简单起见才这样表示。评论的要点是,他应该在创建对象时进行评估,而不是进行后期绑定/自引用。这就产生了最有效的代码和更少出错的代码。我想这已经失去了微妙之处,但我的回答却措辞拙劣。为什么要有一个方法可以直接作为属性使用a.ns.length
?在OP示例中,有一个annonymous对象,所以我们应该使用This
。另外,我想OP要求的是属性
而不是函数
+1我想知道,在明年发布下一个版本的JS之前,我们是否能够使用这样酷的语法:'(