2

extendこれは、 Pro Javascript Design Patterns、Apress、2008、p.44での定義です。

function extend(subClass, superClass) {
  var F = function() {};
  F.prototype = superClass.prototype;
  subClass.prototype = new F();
  subClass.prototype.constructor = subClass;

  subClass.superclass = superClass.prototype;
  if(superClass.prototype.constructor == Object.prototype.constructor) {
    superClass.prototype.constructor = superClass;
  }
}

ラインについてはsubClass.superclass = superClass.prototype;、そうしても同じだと思います。将来的には、とにかくsubClass.superclass = superClassいつでもプロトタイプにたどり着くことができるからです。subClass.superclass.prototypeしかし、コンストラクター関数を指すのではなく、プロトタイプを指すのはなぜだと思いましたか?しかし、これは小さな質問です。

より重要な質問は、なぜ最後の行がオブジェクトのプロトタイプのコンストラクターを自分自身に戻そうとするのかということです。私はFirefoxとChromeでそれを試しました、そして彼らはいつもすでにそのように指しています。

また、少し奇妙なのは、なぜそれを使用するのif(superClass.prototype.constructor == Object.prototype.constructor)ですか?if (superClass === Object)代わりに使用しないのはなぜですか?

4

1 に答える 1

2

subClass.superclass = superClass.prototype; コンストラクター関数を指さずに、プロトタイプを指してみませんか?

両方を行うことができ、それは単なる設計上の問題です。superClassスーパーメソッドを呼び出したい上書きされたメソッドでは、プロパティが主に必要であると思います。これは、を呼び出すことで実行できますthis.constructor.superClass[methodName]。しかし、はい、このためのプロパティが必要なのは少し奇妙ですconstructor。プロトタイプの直接プロパティは再び簡単だったでしょう。

より重要な質問は、なぜ最後の行がオブジェクトのプロトタイプのコンストラクターを自分自身に戻そうとするのかということです。

貧弱なプロトタイプ宣言との互換性のために行われているようです。誰かが使用する場合

MyClass.prototype = {…};

をリセットしません。constructorその後、extend(MySubClass, MyClass)で、スーパークラスコンストラクターの一般的な適用が行われます。superClass.prototype.constructorObject

this.constructor.superClass.constructor.apply(this, args);
// for those who don't want to use MyClass.apply

コンストラクターでMySubClass失敗します。したがって、extend関数はこれを修正します。

また、少し奇妙なのは、なぜそれを使用するのif(superClass.prototype.constructor == Object.prototype.constructor)ですか?if (superClass === Object)代わりに使用しないのはなぜですか?

なぜ必要なのかが明確になっているはずですsuperClass.prototype.constructor。しかし、はい、Objectの代わりに使用することもできますObject.prototype.constructor

于 2012-10-02T13:40:05.837 に答える