2011-05-27 184 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