【问题标题】:Jquery extend() merges anonymous objects but doesn't merge instances of my classesJquery extend() 合并匿名对象但不合并我的类的实例
【发布时间】:2014-01-07 18:35:00
【问题描述】:

这很好用:

.extend(true, {}, { name: "john doe", age: 20, address: {street:"aaa", number:"bbb"} }, { gender: "M", address: {} })

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

【问题讨论】:

  • 我认为您在使用 $.extend 时遇到的任何奇怪之处是由于处理的不是预期的普通对象。它根本不适用于该用例。
  • 更不用说......甚至可以“合并”一个类的两个单独实例吗?我想如果你把它分解成你可以的属性,但是这种寒冷会导致奇怪,这取决于属性的构造方式以及它如何影响所述类的其他部分。
  • 听起来你需要为你的类编写一个合并函数,这可能就像用普通对象在类中点击$.extend 一样简单。
  • 请注意,这里没有任何类,只有构造函数和构造对象。类是 ES6 中可能出现的东西。
  • @FabrícioMatté:即使在 ES6 中,我认为类最终归结为我们都学会喜欢的相同原型模式。

标签: javascript jquery extend object-oriented-analysis


【解决方案1】:

要添加到另一个答案,您可以尝试将其转换为普通对象,虽然我不确定这是否是正确的方法,但它应该可以工作:

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')));

【讨论】:

  • 当我看到它时,我很想将toPlainObject 添加为Person 的方法,但那时它不是可重用的。
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2018-12-18
  • 2020-07-31
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2012-04-25
相关资源
最近更新 更多