0

私は2つの異なるパターンと説明を見ました。DailyJSおよび他の多くの1つ:Rectangle.prototype = new Shape();

そして、ここにCrockfordがあります。これは、Rectangle.prototype=Shape;だけを意味します。

理論的には、なぜ「新しい」を実行する必要があるのでしょうか。はい、コンストラクター関数を実行します。また、RectangleのプロトタイプにShapeのプロトタイプを割り当てます。ただし、親をプロトタイプに割り当てるだけで継承を実行できるはずです。

その理由はプロトタイプの連鎖なのだろうかと思いました。ケース1の場合、プロトタイプチェーンが作成されるようです。つまり、RectangleプロトタイプにはShapeプロトタイプがあります。2番目のケースでは、RectangleのプロトタイプにはShapeのメソッドのみが含まれますが、Shapeのプロトタイプメソッドは含まれません。

そうですか?どんな考えにも感謝します。

4

1 に答える 1

4

ちょうど意味するクロックフォードRectangle.prototype = Shape;

よくわかりません。

理論的には、なぜ「新しい」を実行する必要があるのでしょうか。はい、コンストラクター関数を実行します。

しかし、実際にはそれは必要ありません(必要はありません)。Shape.prototype

また、RectangleのプロトタイプにShapeのプロトタイプを割り当てます。

あまり。から継承する新しいオブジェクトnew Shapeを作成します。それが私たちにとって重要なことです。あなたはその権利を持っています。Shape.prototype

2番目のケースでは、RectangleのプロトタイプにはShapeのメソッドのみが含まれますが、Shapeのプロトタイプメソッドは含まれません。

それは正解です。インスタンスを作成するのではなく、 -から継承する必要がありますShape.prototypeが、経由で継承する必要があります。Object.create(Shape.prototype)JavaScriptの継承を参照してください:Object.create vs newまたはここで「new」キーワードを使用しない理由は何ですか?。これは、Crockfordが実際に行っていることObject.createです。EcmaScript5.1によって導入される前でさえ、彼はヘルパー関数を使用してそれを行うための賢い方法を見つけました。

function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}

これは、Object.createネイティブでサポートされていないブラウザで一般的なシムになりました。

于 2012-10-26T14:54:44.693 に答える