可以立即调用的属性是否可以引用它所分配的对象?

时间:2013-10-08 20:13:17

标签: javascript

我有一些代码:

var obj = {
    foo : true,
    bar : (function() {
        if (obj.foo) {
            return qux;
        }
    })()
};

我的问题是永远不会返回qux,因为obj执行时bar不存在,因为bar是一个立即调用的函数。

有一个解决方案:

var obj = {
    foo : true
};

obj.bar = (function() {
    if (obj.foo) {
        return qux;
    }
})();

但我发现以前的代码更简单。有没有办法实现这个目标,还是我坚持使用后者?

提前致谢。

2 个答案:

答案 0 :(得分:2)

  

有没有办法实现这个目标,还是我坚持使用后者?

假设qux不是IIFE的局部变量,你可以使用它(你仍然需要拆分对象声明):

var obj = {
    foo : true
};
obj.bar = obj.foo ? qux : undefined;

答案 1 :(得分:2)

实际上有一种方式或者至少是关于如何做到这一点的想法,但这有点荒谬。

注意:我没有实现依赖于其他delayedMembers的delayedMembers。

function delayedObj(o) {
    var k, v;
    for (k in o) {
        if (o.hasOwnProperty(k) && (v = o[k]).__delayedMember__) {
            o[k] = v.fn.call(o);
        }
    }
    return o;
}

function delayedMember(fn) {
    return {
        __delayedMember__: true,
        fn: fn
    };
}

然后你可以定义你的对象:

var obj = delayedObj({
    foo : true,
    bar : delayedMember(function () {
        return this.foo;
    })
});

console.log(obj.bar); //true