2014-12-05 65 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