将对象的属性附加到另一个对象的最佳方法

时间:2011-10-18 08:55:44

标签: javascript node.js

是否有一种简单的方法可以将一个对象的属性复制到另一个对象中。

例如

var a = {
  afunc: function(bla) {
    alert('hello ' + bla);
  },
  avalue: 'aaa'
};

var b = {
  bfunc: function(blb) {
    alert('hi ' +blb);
  },
  bvalue: 'bbb'
};

magically_copy_a_to_b(a,b);
b.afunc('world');

应打印hello world

4 个答案:

答案 0 :(得分:1)

枚举a的属性,然后在b处设置属性。注意:对象通过引用传递,复制。

复制:

  • 数字,字符串,布尔值 - COPIED
  • 数组:使用copiedArray = array.slice()复制数组array
  • 简单的功能(不参考范围,例如在您的示例中):
    copiedFunc = eval(originalFunc.toString())

function magically_copy_a_to_b(a,b){
    for(var prop in a){
        /* Example: copying all string properties*/
        if(typeof prop[a] == "string"){
            b[prop] = prop[a];
        }
    }
}

答案 1 :(得分:0)

我认为你制造了很多混乱,无论如何我纠正了你的对象(没有var和use :),这可以通过枚举一个对象的属性并将它们添加到另一个对象(避免原型链)来实现。 p>

function magically_copy_a_to_b(org, dest){
    for (var prop in org){
       if (org.hasOwnProperty(prop)){
            dest[prop] = org[prop];
        }
    }
    return dest;
}
var a = {
  afunc: function(bla) {
    alert('hello ' + bla);
  },
  avalue: 'aaa'
};

var b = {
  bfunc: function(blb) {
    alert('hi ' +blb);
  },
  bvalue: 'bbb'
};

b = magically_copy_a_to_b(a,b);


b.afunc('world');

答案 2 :(得分:0)

您可以使用具有内置extend功能的underscore.js

_.extend(b, a); // merge a into b

然后你可以这样做:

b.afunc('hello');

答案 3 :(得分:0)

此方法将json对象的属性永久添加到另一个对象。因为JS是一种脚本语言,所以“eval”函数可以用更短的代码来节省时间!最后,我正在使用json,因为在“for(ob obj2 in obj2)”中它返回定义到obj1中的每个键,并且在更大的代码中处理json比使用简单数组更有趣。例如,对json对象数组进行排序非常容易,而且你不必使用邪恶的“i”来获取它。

function magically_copy_properties(jsonFrom,jsonTo) {
    for (var key in jsonFrom) {
        eval([
            "jsonTo.",key,"=jsonFrom.",key
        ].join(""));
    }
}

var a = {
   "a1": function() {
       return "hello";
   },
   "a2": function() {
       return "hey";
   },
   "aSpace": function() {
       return " ";
   }
}

var b = {
   "b1": function() {
       return "ho";
   },
   "b2": function() {
       return "world";
   }
}

magically_copy_properties(a,b);
alert(b.a1() + b.aSpace() + b.b2());