1

jsFiddle デモ

Shape を継承した F があります。

F.prototype = Shape.prototype;

F は test という名前の新しいメソッドを作成します。

F.prototype.test = function(){return 'test';};

F.prototype = Shape.prototype;Fで作成したすべてのメソッドを記述すれば、Shapeから継承する他のクラスで利用できることを理解しています。

私は何を間違えましたか?

コードを実行するとエラーが発生するのはなぜalert(B.test());ですか?

function Shape(){}
Shape.prototype.name = 'shape';
Shape.prototype.toString = function() {return this.name;};

var F = function(){};
F.prototype = Shape.prototype;
F.prototype.test = function(){return 'test';};


function Triangle(side, height) {
this.side = side;
this.height = height;
}

Triangle.prototype = new F();
Triangle.prototype.constructor = Triangle;
Triangle.prototype.name = 'Triangle';

var my = new Triangle(5, 10);
alert(my.toString());

var Second_class = function(){};
Second_class.prototype = Shape.prototype;
B.prototype = new Second_class();
alert(B.test());

この例では、 jsFiddleFから継承ShapeおよびTriangle作成された場合、デモはうまく機能しますF

4

1 に答える 1

2

Shape から継承した F があります。

F.prototype = Shape.prototype;

厳密に言えば、そうではありません。prototype関数のプロパティを上書きしていFます。実際の継承チェーンを構築するには、次を使用する必要があります

F.prototype = Object.create(Shape.prototype);

そのため、Shape のプロパティは引き続き F インスタンスで使用できますが、その逆はできません (両方のプロトタイプが同じオブジェクトであったため)。最初の質問に答えるには: はい、そうです。

Child.prototype = new Parent(); ではなく Child.prototype = Parent.Prototype を使用しない理由も参照してください。Javascriptの継承のため?

なぜコードを実行すると alert(B.test()); それは動作していませんか?

説明するのは簡単です。B(例で宣言するのを忘れましたが、それが関数であると仮定しましょう)は Function オブジェクトです。プロパティが割り当てられていません。あなたが行ったことは、それのプロトタイププロパティを設定することです(newキーワードを使用すると、プロトタイプチェーンも正しく設定されますが、誤ってインスタンスが作成されます-Object.create優先されます)。したがって、 のインスタンスはすべてB、そのプロトタイプ オブジェクトから継承されます。

var b = new B();
b.test();
于 2012-09-19T18:39:58.127 に答える