2011-03-07 63 views
4

我試圖從objA適用對象屬性objB但我意識到Ext.apply是有缺陷的(或祝福?)在它僅適用於第一級的方式對象組合在一起。有沒有更好的方法來使用Ext.apply將子/子對象組合到另一個對象中?

例子:

var objA = { 
    name: 'objA', 
    baseParams: { 
     cols: [1,2,3,4,5] 
    } 
}; 

//used in subclass 
var objB = { 
    name: 'objB', 
    baseParams: { 
     limit: 50, 
     sort: 'name' 
    } 
}; 

//used in baseclass 
var objC = { 
    name: 'objC', 
    baseParams: { 
     as_hash: true, 
     limit: 20 
    } 
}; 

Ext.apply(objB,objA); //used in subclass 
Ext.apply(objC,objB); //used in baseclass 

例將輸出:

obj = { 
    name: 'objA', 
    baseParams: { 
     cols: [1,2,3,4,5] 
    } 
}; 

我想這個輸出,而不是(預期輸出):

obj = { 
    name: 'objA', 
    baseParams: { 
     cols: [1,2,3,4,5], 
     as_hash: true, 
     limit: 50, 
     sort: 'name' 
    } 
}; 

我怎樣才能做到這一點而不做這個?

// subclass: 
var bpTemp = {}; 
bpTemp.baseParams = Ext.apply(objB.baseParams, objA.baseParams); 
Ext.apply(objB,objA); 
Ext.apply(objB,bpTemp); 

// base class: 
var bpTemp = {}; 
bpTemp.baseParams = Ext.apply(objC.baseParams, objB.baseParams); 
Ext.apply(objC,objB); 
Ext.apply(objC,bpTemp); 
+0

有趣的問題,期待着一個很好的解決方案 – ChrisR 2011-03-07 11:55:44

+0

謝謝你,還在尋找一個答案,但。 – CincauHangus 2011-03-08 02:51:29

回答

1

可以Ext.apply改變了方式()的作品,使得第四個參數可以是一個布爾暗示「深」申請 - 這將與你的榜樣工作(深默認爲true):

Ext.apply = function(o, c, defaults, deep){ 
    deep = deep!==false; 
    // no "this" reference for friendly out of scope calls 
    if(defaults){ 
     Ext.apply(o, defaults); 
    } 
    if(o && c && typeof c == 'object'){ 
     for(var p in c){ 
      o[p] = (deep && Ext.isObject(o[p]) && Ext.isObject(c[p])) ? Ext.apply(o[p], c[p]) : c[p]; 
     } 
    } 
    return o; 
}; 
+0

僅供參考 - 我的默認「深」的說法爲真,讓您的工作,例如...但我不會做,在你的應用程序,因爲分機可能取決於非深內部應用 - 我會明確地讓「深」在個案基礎在你的應用程序 – 2011-03-09 02:24:45

+1

的情況下,你有一個很好的解決方案,但它是不實際的,也不建議改變的庫函數,因爲它可能會影響使用它的其他人(尤其是如果它是一個常用的方法)。我將其標記爲答案,因爲它回答了問題。 – CincauHangus 2012-02-15 09:49:24

+0

同意,但如果您默認「深」到錯誤,則此更改可能是安全的(r)... – 2012-02-16 20:16:42

0

你可以嘗試一個遞歸解決方案,有一些特殊情況,如下圖所示:

function deepApply(receiver, config, defaults) { 
    if (defaults) { 
     deepApply(receiver, defaults); 
    } 
    if (receiver && config && typeof config == 'object') { 
     for (var p in config) { 
      if (typeof config[p] != 'object' || Ext.isArray(config[p])) { 
       receiver[p] = config[p]; 
      } else { 
       if (typeof receiver[p] != 'object') { 
        receiver[p] = {}; 
       } 
       deepApply(receiver[p], config[p]); 
      } 
     } 
    } 
    return receiver; 
} 
相關問題