2014-12-05 66 views
-1

小事兒,但想知道是否有人可以建議更好的語法來使用splat擴展現有對象,但不使用大括號?我的主要目的是在擴展對象傳遞給函數時保持縮進樣式。這有正確的行爲:用splat擴展對象並做

base-obj = 
    old-prop: \value 

do-something { 
    ...base-obj 
    extended-prop: \value 
} 

但是,大括號可以以某種方式消除嗎? 「做」不工作:

old-obj = 
    old-prop: \value 

do-something do 
    ...old-obj 
    new-prop: \value 

    # do-something will only see new-prop 

回答

0

我發現< < <將完成這項工作,但在一個有點迂迴的方式:

do-something {} <<< base-obj <<< 
    extended-prop1: \value1 
    extended-prop2: \value2 

更新:修改,以防止副作用根據@ homam的建議改爲base-obj。

+1

'{} <<<基OBJ <<<擴展丙:\ value' – homam 2014-12-06 13:57:39

+0

'擴展丙:\值<<<鹼基obj' – blvz 2015-01-21 14:05:08

+0

@blvz似乎很明顯,但不起作用。編譯爲{extendedProp:import $('value',baseObj)} – 2015-04-08 00:04:37

2

也許你想要的是with

do-something base-obj with do 
    extended-prop: \value 

LiveScript 1.3.1 operators' docs

與(又名cloneport)中綴結合了克隆和財產的複製操作,便於創建對象。它相當於^^ obj < < < obj2。請記住,克隆操作符創建原型克隆,並且原型不以JSON序列化。

+0

它確實有效。以爲我之前嘗試過,但現在我意識到我得到了錯誤的結果,因爲livescript.net上的解釋器錯誤地評估了do-something的返回值(不知道爲什麼)。爲了明白我的意思,將這段代碼粘貼到livescript.net中http://jsbin.com/hibahafoga/1/edit?js,console,output – 2015-01-21 04:28:53

+0

這是因爲livescript.net上的輸出被序列化爲JSON。 「請記住,克隆操作符創建原型克隆,並且原型不會以JSON序列化。」試試這個:http://jsbin.com/gejakucoyu/2/edit?js,console,output – blvz 2015-01-21 14:01:56

+0

清除它,謝謝 – 2016-04-02 06:03:52

0

的另一種方法,使用do

# new object can overwrite old-obj 
do-something do 
    old-obj <<< 
    new-prop: \value 
    another: \content 


# old-obj can overwrite new object 
do-something do 
    do 
    new-prop: \value 
    another: \content 
    <<< old-obj