2013-10-08 29 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

相關問題