1

こんにちは私はjQueryとJavaScriptに比較的慣れていないので、の機能について質問があります$.extendextend「基本クラス」を拡張するクラスのプロトタイプを上書きするために使用しています。ベース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, {});

4

1 に答える 1

8

したがって、これを行うと:

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

これは結果として起こります:

  1. プロパティ"Aone"、およびは、ではなくに"Atwo"割り当てられます(その時点ではイベントは存在しません)。Parent.prototype.someObjectA.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 に答える