14

これらのスニペットの違いは何ですか?:

constructor: function(config) {
    this.initConfig(config);
}

constructor: function(config) {
    this.callParent(arguments);
}

constructor: function(config) {
    this.superclass.constructor.call(this, config);
}

そして、他のメソッドをオーバーライドすることはどう違うのconstructorですか?

4

1 に答える 1

26

2 番目と 3 番目のスニペットは機能的に同等です。プロパティ callParentを経由する代わりに、親の関数を呼び出すためのよりクリーンで簡単な方法です。superclass

最初の例はまったく異なります。1 つは、親のコンストラクターを呼び出しません。これは通常、悪いニュースです。基本クラスには通常、実行する必要があるいくつかの初期化があり、コンストラクター (および initComponent) の親を呼び出すのを忘れると、バグの一般的な原因になります。

initConfigは、次のような便利なメソッドです。

  • オブジェクトの初期設定を渡された設定とマージします
  • 構成内のすべてのプロパティのゲッターとセッターを作成する
  • 構成をオブジェクトに適用する

これは、親コンストラクターの呼び出しとはまったく異なります。親コンストラクターの呼び出しは、それが何をするように書かれているかに完全に依存しています。を使用するものもあれば、使用initConfigしないものもあり、initConfig と同様のことを手動で行うものもあります。

を使用する必要はなくinitConfig、場合によっては危険ですらあります。しかし、それはまったく別の話です (Ext 4.1 の場合、initConfig は無害であり、4.0 と同じ危険な副作用を含まないように見えます)。

サイドノート

指摘するだけです。2 番目と 3 番目のスニペットでは、コンストラクターは必要ありません。コンストラクターが親のコンストラクターのみを呼び出している場合は、コンストラクターを完全に除外できます。

于 2012-04-12T01:20:21.727 に答える