2013-07-17 42 views
0

方案動態前置一個參數的所有方法中的對象

我有很多的屬性和方法的對象,並假設它存儲在Global.Framework。現在,我有另一個對象User,我想通過將.Framework複製到User來爲其提供訪問Global.Framework

然而,User也有一個稱爲Name屬性,(存儲在User.Name),其需要被傳遞到每個框架的方法爲第一個參數,透明。

示例代碼

例如,在用於Global.Framework方法聲明,可能存在類似

Global.Framework = { 
    methodOne: function(name, a, b, c) { /* do something */ }, 
    methodTwo: function(name, a) { /* do something */ }, 
    propertyOne: 100, 
    propertyTwo: "me" 
} 

但是,我想這些方法被暴露於User.Framework這樣的:(本屬性簡單地克隆,不需要任何額外的處理)

User.Framework = { 
    methodOne: function(a, b, c) { 
     return Global.Framework.methodOne(User.Name, a, b, c); 
    } (...) 

的問題

顯然,作爲方法在Framework量會有所改變,甚至他們的觀點,我不能宣佈他們一個個在克隆過程中手動。

什麼我試過到目前爲止

我擡起頭來如何獲得的參數動態,發現這個:How to get function parameter names/values dynamically from javascript

但我不知道如何做到這一點,它最好不要使用太多的處理資源。這是我想到的是:通過每個屬性的Framework對象

  1. 走,如果不是一個函數克隆它,或
  2. 獲取功能
  3. 參數列表?重寫調用return functionBeingLooped(User.Name, [the rest of the arguments])

我卡上的步驟3和我有限的JavaScript知識使我想起了什麼,除了eval(這是毫無疑問的)。有沒有辦法做到這一點?

回答

1

您可以將所有User.Framework函數設置爲閉包(不知道如何克隆Global.Framework)。

這裏是僞代碼假設用戶名來作爲第一個參數,如果沒有你將不得不解析Global.Framework funtction的ToString()值:

var org={}; 
org.t = function(name, a ,b){ 
    console.log(arguments); 
}; 


var cloned={}; 
cloned.name="cloned"; 
// your cloning method 
for(thing in org){ 
    if(typeof org[thing] === 'function'){ 
    // if name isn't the first argument then you have to use 
    // org[thing].toString() and parse that 
    cloned[thing]=function(){ 
     org[thing].apply(cloned,[cloned.name] 
     .concat(Array.prototype.slice 
     .call(arguments, 0))); 
    } 
    } 
} 

console.log(cloned.t("a","b")); 
+0

明白了,謝謝! –

+0

這裏存在一個小問題 - 每次運行都會覆蓋'thing'變量,而且當我被稱爲克隆[a]時,如果它通過org [a],[b],[c] in該命令,調用克隆[任何東西]將嘗試在[c]上調用.apply。我該如何解決這個問題? –

+0

@JimmieLin您是否使用某種返回克隆版本的函數創建多個實例?在這種情況下,我需要看到克隆功能本身。 – HMR

相關問題