这很好用:
.extend(true, {}, { name: "john doe", age: 20, address: {street:"aaa", number:"bbb"} }, { gender: "M", address: {} })
但是当地址是一个类时,第二个地址会覆盖第一个地址而不是合并它们。
function Address(data) {
this.data = data;
}
$.extend(true, {}, { name: "john doe", age: 20, address: new Address({street:"aaa", number:"bbb"}) }, { gender: "M", address: new Address({}) })
这是jQuery的错误还是预期的行为?如何合并一个类的两个实例?
答案 0 :(得分:2)
要添加到其他答案,您可以尝试将其转换为普通对象,但我不确定这是否是正确的方法,但它应该有效:
function Person(name) {
this.name = name;
}
Person.prototype.say = function() {
return this.name + ' says hello!';
};
var toPlainObject = function(x) {
var obj = Object.create(null);
for (var i in x) obj[i] = x[i];
return obj;
};
// false
// Person {name: 'John', say: function}
$.isPlainObject(new Person('John'));
// true
// Object {name: 'John', say: function}
$.isPlainObject(toPlainObject(new Person('John')));
答案 1 :(得分:1)
jQuery.extend
始终从右向左复制。第二个覆盖第一个,第三个覆盖第二个。因此,第三个address
的属性值当然会覆盖第二个属性值。它没有更深入地合并,因为address
的属性值未通过jQuery.isPlainObject()
测试。
function Address(data) {
this.data = data;
}
console.log( jQuery.isPlainObject(new Address()) ); // false
如果Address
改为返回普通对象,则不会发生这种情况。
function Address(data) {
var obj = {};
obj.data = data;
return obj;
}
console.log( jQuery.isPlainObject(Address()) ); // false