2012-07-25 35 views
2

我一直在使用jQuery.extend更换这样从JavaScript中另一个对象的属性更换对象的属性,没有图书馆

var Car = function(options){ 
    var defaultOptions = { 
     color: "hotpink", 
     seats: { 
      material: "fur", 
      color: "black", 
      count: 4 
     }, 
     wheels: 4 
    } 
    this.options = $.extend(true,{},defaultOptions,options); 
} 

var myCar = new Car({ 
    color: "blue", 
    seats: { 
     count: 2, 
     material: "leather" 
    } 
}); 

alert(myCar.options.color); // "blue" 
alert(myCar.options.seats.color); // "black" 
alert(myCar.options.seats.count); // 2 

默认属性虽然它的伟大工程,我想知道最好的没有任何图书馆的方式来实现类似的结果我只是想在函数中定义一些默认设置,并用参数中的设置替换它们,每次我这样做时都会包含一个库来矫枉过正。

回答

4

基本上它只是for..in的递归使用。你可以看到jQuery实现的完整源代码in the source code(这个行号会随着时间的推移而变坏,但它可能会保留在core.js之内)。

这里是一个非常基本的现成的,袖口:

function deepCopy(src, dest) { 
    var name, 
     value, 
     isArray, 
     toString = Object.prototype.toString; 

    // If no `dest`, create one 
    if (!dest) { 
     isArray = toString.call(src) === "[object Array]"; 
     if (isArray) { 
      dest = []; 
      dest.length = src.length; 
     } 
     else { // You could have lots of checks here for other types of objects 
      dest = {}; 
     } 
    } 

    // Loop through the props 
    for (name in src) { 
     // If you don't want to copy inherited properties, add a `hasOwnProperty` check here 
     // In our case, we only do that for arrays, but it depends on your needs 
     if (!isArray || src.hasOwnProperty(name)) { 
      value = src[name]; 
      if (typeof value === "object") { 
       // Recurse 
       value = deepCopy(value); 
      } 
      dest[name] = value; 
     } 
    } 

    return dest; 
} 
+0

如果OP想要保留API,那么jQuery是一个好的开始,但是如果OP准备改变(简化)API,则构建的扩展可以更短,更高效和更健壮(例如,jQuery * isPlainObject *非常普通而且不必要,* isFunction *或* isArray *)也是如此。 – RobG 2012-07-25 09:52:26

+0

RobG说,jQuery实现看起来像是一个相当多的代码。我想知道是否有任何解决方法或解决此问题的其他方法。 – user1463028 2012-07-26 09:43:32

+1

我试图做一个易于使用的,独立的代码片段,基本上只有一个函数,里面有几个方法。有点像jQuery插件,但不依赖于jQuery。 我想让用户在一个单一的对象中定义所有的选项为了可读的代码,但我想定义一切的默认值,所以用户不需要改变任何东西,如果他对默认值满意外观和功能。 – user1463028 2012-07-26 09:53:51

0

可以效仿jQuery的API“扩展”,就像楼上说。我认为没有更好的办法来做到这一点。所以,我认为jQuery的API是适当的。