您好我对jQuery和JavaScript相对较新,对$.extend
的功能有疑问。
我正在使用extend
来覆盖扩展“基类”的类的原型。
让我们调用基础Parent
和子/扩展类A
和B
。
现在,当我使用$.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, {});
答案 0 :(得分:8)
所以,当你这样做时:
$.extend( true, A.prototype, {
someObject: {Aone: 1, Atwo: 2}
});
结果会发生这种情况:
"Aone"
和"Atwo"
将分配给Parent.prototype.someObject
,而不是A.prototype.someObject
(此时不存在事件)。A.prototype.someObject
,其值将设置为Parent.prototype.someObject
。因此,A.prototype.someObject
和Parent.prototype.someObject
都会引用同一个对象:
A.prototype.someObject === Parent.prototype.someObject // true
当然,这是不是你想要的。
话虽如此,我担心你的模式不好。 A.prototype
应该从Parent.prototype
继承,但您将<{1}}的值复制。
此外,您当前的解决方案:
Parent.prototype.someObject
不直观。解密代码正在做什么并不容易。我建议重新评估该模式。 (当然,您可以向Stack Overflow寻求帮助。)