3

我需要参考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'
    },

我得到错误

this is not defined

从 A 开始。

4

4 回答 4

2

你可以使用jsget operator实现“属性即函数”的效果:

...
A: {
 ns : 'asdsad',
 get len(){ return this.ns.length;},
}
...

现在您可以将其用作普通属性:

A.len这将永远是实际的。

这里有更多细节:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/get

于 2013-06-04T21:36:40.770 回答
1

您不能在您拥有的数据结构中引用包含对象。同样,在像您这样的静态声明中,您也不能引用同级属性。

您可以在更高级别定义字符串,然后在两个地方引用它,如下所示:

var strData = 'FOO_';
var SStorage = FOO.support({
    Name: 'SStorage',

    // non functions

    A: {
        storage:    null,
        ns:         strData,
        len:        strData.length,
        indicator:  'FOO_h_token'
    },

人们可能还想知道为什么您要传递长度,因为调用者可以随时从传入的字符串中简单地检索长度。不需要单独通过。

我实际上建议的是,你完全消除数据结构中的长度,如果你想要一种简短的方法来引用它,那么在这样的实现中将它放在一个局部变量中FOO.support()

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
}
于 2013-06-04T21:26:33.550 回答
0
len: null,  // should hold the length of the string in ns:

您需要为此使用一种方法

A: {
        storage:    null,
        ns:         'FOO_',
        indicator:  'FOO_h_token',
        len: function(){ return this.ns.length; }
    }

你当然会称之为

A.len();

但是,正如 jfriend00 所指出的,如果这真的是你所需要的,那么就完全放弃 len 并做

A.ns.length;
于 2013-06-04T21:28:21.733 回答
-2

另一个答案很好,但不要忘记显而易见的......

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'
},
于 2013-06-04T21:32:02.397 回答