2017-10-06 71 views
0

我是一個名爲Duckuino的項目的合作者,模塊加載了eval()執行另一個文件的內容,其中new Object()裏面,我想要項目別名,以避免重複代碼兩次,如下所示:如何複製對象內聯定義中的項目?

new Object({ 
    commands: { 
    aVeryComplexCommand: function(WithParams) { 
     // Complex content 
    }, 
    anAliasForTheCommand: //something which point to 'aVeryComplexCommand' 
    } 
}); 

請注意,我不能把代碼new Object()聲明之後,因爲它可以由eval()被誤解,我不想修改,因爲別名模塊特定的它加載模塊的代碼。

感謝提前!

編輯:從兩個尖尖和Nathan P.的回答工作,所以我會有關討論與我的其他合作者,我會有效的答案,我們使用。

+2

你不能這樣做,在JavaScript中的對象初始化。你必須使用一個單獨的聲明。 – Pointy

+0

@Pointy:沒有解決方法或怪異的代碼與'this'語句或任何東西? – Nurrl

+0

看到我的答案; 'this'不涉及對象初始值設定項。 – Pointy

回答

3

你必須使用一個單獨的語句:

new Object(function() { 
    var obj = { 
    commands: { 
     aComplexCommand: { ... } 
    } 
    }; 
    obj.commands.alias = obj.commands.aComplexCommand; 
    return obj; 
}()); 

這是有效的JavaScript,但是否會混淆你eval()機制,我不能說。

+0

我現在正在嘗試^^ – Nurrl

1

也許你可以做這樣的事情,使用代理類功能:

var o = new Object({ 
 
    commands: { 
 
    aVeryComplexCommand: function(With, Params) { 
 
     console.log('This is complex !', With, Params); 
 
    }, 
 
    anAliasForTheCommand: function() { 
 
     var args = [].slice.call(arguments); 
 
     return this.aVeryComplexCommand.apply(this, args); 
 
    } 
 
    } 
 
}); 
 

 
o.commands.anAliasForTheCommand('hello', 'world');

+1

你忘了返回成爲一個完美的雙向代理,但它的工作原理,我會找出與我的其他合作者使用什麼^^感謝:D – Nurrl

+0

你是對的,謝謝:) –