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之前,我们是否能够使用这样酷的语法:'(