0

给定一个 JS 文字对象,例如:

var foo = {
    _stuff : {
        a:10,
        b:20,
        c:30,
        state
    }
}

和文字功能

addAB: function() {
    add(foo._stuff[a], foo._stuff[b]);
}

addAC: function() {
    add(foo._stuff[a], foo._stuff[c]);
}

add: function(bar, baz) {
    foo._stuff[bar] += foo._stuff[baz];
    state(foo._stuff[bar]);
}

state: function(value) {
   foo.state[value] = .... something complex ....
}

如何一次性获得以下内容?

add(AB); foo._stuff[a] should be 30, foo.state[foo._stuff[a]] is something new
add(AC); foo._stuff[a] should be 40, foo.state[foo._stuff[a]] is something new

正如 add() 将尝试查找 foo._stuff[10] 显然不会做我想要的。

是的,我知道 addAB() 和 addAC() 存在冗余,但这是我无法控制的。

4

3 回答 3

2

传递索引而不是值,如下所示:

addAB: function() {
    add('a', 'b');
}

addAC: function() {
    add('a', 'c');
}
于 2012-12-31T21:52:24.167 回答
0
add: function(bar, baz) {
    if (arguments.length === 1) {
        this['add' + arguments[0]];
    } else {
      foo._stuff[bar] += foo._stuff[baz];
      state(foo._stuff[bar]);
    }
}

// assuming you are calling
var AB = 'AB', AC = 'AC';
add(AB); 
add(AC);

否则,我不知道你在问什么。

于 2012-12-31T21:52:33.227 回答
0

我不确定我是否完全遵循您想要完成的任务,但是您的对象文字不是有效的语法。我不明白你为什么想要_stuff房产。而且,您需要将state属性初始化为某个值,即使它未定义。但是,由于您想state根据某个属性名称在属性中存储值,因此您应该初始化state为一个对象。

var foo = {
    a:10,
    b:20,
    c:30,
    state: {}
}

你的JavaScript:

addAB: function() {
    add('a', 'b');
}

addAC: function() {
    add('a', 'c');
}

add: function(propName0, propName1) {
    foo[propName0] += foo[propName1];
    state(propName0);
}

state: function(propName) {
    // state is initialized to an object, so can store properties in there now
   foo.state[propName] = .... something complex ....
}
于 2012-12-31T21:55:53.917 回答