jQuery扩展了原型

时间:2012-09-17 20:58:40

标签: javascript jquery

您好我对jQuery和JavaScript相对较新,对$.extend的功能有疑问。 我正在使用extend来覆盖扩展“基类”的类的原型。 让我们调用基础Parent和子/扩展类AB。 现在,当我使用$.extend(true, A.prototype, {someObject: {extraKey: 'value'}});时,似乎Parent的原型在someObject的内容上发生了变化,如果几个对象/类继承自父项,则会导致非常奇怪的行为。只有在使用“深度”扩展时才会发生这种情况。

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

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

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

1 个答案:

答案 0 :(得分: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
  3. 因此,A.prototype.someObjectParent.prototype.someObject都会引用同一个对象:

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

    当然,这是不是你想要的。


    话虽如此,我担心你的模式不好。 A.prototype应该从Parent.prototype 继承,但您将<{1}}的值复制。

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

    Parent.prototype.someObject

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