2013-10-08 31 views
2

我有一些代码:立即调用的属性可以引用它被分配到的对象吗?

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; 
    } 
})(); 

但我发现以前的代码更简单。有没有办法做到这一点,还是我坚持后者?

在此先感谢。

+4

不,不能这样做。 *编辑*等待我会发布一个可能性。 *再次编辑*不,这是一个愚蠢的想法。我坚持我原来的观点:) – Pointy

+0

为什么你认为你需要一个IIFE呢? – meagar

+0

我没有看到立即设置bar属性的意义,特别是当它取决于foo时,它始终为真... – Samy

回答

2

有没有办法做到这一点,还是我坚持后者?

假设qux是不是一个局部变量的IIFE,你可以使用这个(你还需要分割的对象声明,虽然):

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

看起来这是共识。谢谢。 – gwg

+0

是的,你必须拆分字面声明。或者使用构造函数。 – bfavaretto

+0

@bfavaretto你总是可以使用一些帮助函数来获得某种类型的syntaxic糖,就像我的答案一样。 – plalx

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 
+0

有趣,但我同意“有点荒谬”的一部分! :) – bfavaretto

相关问题