Jquery extend()合并匿名对象但不合并我的类的实例

时间:2014-01-07 18:35:00

标签: javascript jquery extend object-oriented-analysis

这很好用:

.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的错误还是预期的行为?如何合并一个类的两个实例?

2 个答案:

答案 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