1

嗨,我对 jQuery 和 JavaScript 比较陌生,并且对$.extend. 我extend用来覆盖扩展“基类”的类的原型。让我们调用基类和Parent子类/扩展类AB. 现在,当我使用它时,Prototype 的内容$.extend(true, A.prototype, {someObject: {extraKey: 'value'}});似乎也发生了变化,如果多个对象/类从父级继承,则会导致非常奇怪的行为。此外,仅当使用“深度”扩展时才会发生这种情况。ParentsomeObject

我设法通过使用各自的原型扩展一个空对象,然后使用扩展的返回值作为新原型来避免这个问题。例如A.prototype = $.extend(true, {}, A.prototype, {someObject: {extraKey: 'value'}});

为了显示问题,我创建了这个小 jsfiddle:http: //jsfiddle.net/x8UtF/12/

实际问题:有没有办法绕过空的物体和东西extend(true, X.prototype, {});

4

1 回答 1

8

所以,当你这样做时:

$.extend( true, A.prototype, {
    someObject: {Aone: 1, Atwo: 2}
});

结果会发生这种情况:

  1. 属性"Aone", 和"Atwo"将被分配给Parent.prototype.someObject, 而不是A.prototype.someObject(此时不存在事件)。
  2. 将创建该属性A.prototype.someObject,并将其值设置为Parent.prototype.someObject

因此,A.prototype.someObjectParent.prototype.someObject都将引用同一个对象:

A.prototype.someObject === Parent.prototype.someObject // true

当然,这不是你想要的。


话虽这么说,我担心你的模式不好。A.prototype应该继承Parent.prototype,但您将值从复制Parent.prototype.someObjectA.prototype.someObject

另外,您当前的解决方案:

A.prototype = $.extend( true, {}, A.prototype, {
    someObject: {Aone: 1, Atwo: 2}
});

不直观。破译代码在做什么并不容易。我建议重新评估该模式。(当然,您可以向 Stack Overflow 寻求帮助。)

于 2012-09-17T22:10:56.650 回答