2011-05-27 129 views
3

我希望我的JavaScript類可以從外部進行配置。所以,我創建了一個私人的config-屬性和一個loadConfig-方法。我的問題是,當我加載一個配置時,它會完全覆蓋配置屬性,而不僅僅是我定義的屬性。在JavaScript中爲函數創建配置

(function() { 
var config = { 
    param: value, 
    group: { 
     groupParam: value 
    } 
}; 
function MyClass() { 
    this.loadConfig = function(loadConfig) { 
     if (typepof loadConfig == "undefined" || typeof loadConfig == "null") 
      return; 
     else 
      config = loadConfig; 
    }; 
} 
window.MyClass = new MyClass(); 
})(); 

當我打開一個自定義配置

<script type="text/javascript"> 
    var config = { 
     group: { 
      groupParam: "newValue" 
     } 
    }; 

    MyClass.loadConfig(config); 
</script> 

我想config.param仍然是 「價值」,而config.group.groupParam是 「NEWVALUE」。

目前,該對象被覆蓋,loadConfig()config.param不存在了。

回答

3

如果你不想推倒重來,jQuery有叫$.extend()一個偉大的功能,這似乎是你所需要的。

您可以檢查出來的jQuery 1.6.1 source例如(按Ctrl +˚F和「擴展」 =>是一個很長的時間,因爲我一直在等待一次使用這些東西鍵盤:))。

+0

@ApoY2k你可以把你的問題標記爲'jquery',然後:)。很高興幫助BTW。 – kapa 2011-05-27 09:35:13

+0

@ ApoY2k嗯,這是真的。 – kapa 2011-05-27 09:42:53

1

它的覆蓋,因爲你告訴它你的loadConfig方法與這條線覆蓋:

config = loadConfig; 

爲了保留該loadConfig沒有明確更改任何值,你會通過所有有循環在loadConfig屬性,並單獨爲它們分配:

this.loadConfig = function (loadConfig) { 
    if (typeof loadConfig == "undefined" || typeof loadConfig == "null") { 
     return; 
    } else { 
     var x; 
     for (x in loadConfig) { 
      if (Object.prototype.hasOwnProperty.call(loadConfig, x)) { 
       config[x] = loadConfig[x]; 
      } 
     } 
    } 
}; 
+0

@ ApoY2k它不會,但深循環打開了一堆新的蠕蟲罐。會不會有數組,或只是對象? – sdleihssirhc 2011-05-27 07:23:12