0

toString()から継承されていないメソッドがありShapeます。なんで?

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

function TwoDShape(){
  this.name = '2D shape';
}

function Triangle(side, height) {
  this.name = 'Triangle';
  this.side = side;
  this.height = height;
  this.getArea = function(){return this.side * this.height / 2;};
}

TwoDShape.prototype = TwoDShape;
Triangle.prototype = Triangle;

TwoDShape.prototype.constructor = TwoDShape;
Triangle.prototype.constructor = Triangle;

var my = new Triangle(5, 10);

document.write("my getarea: " + my.getArea() + "my name is: " + my.toString()  + "<br>");​

jsFiddle のデモ。

4

3 に答える 3

3

Triangleのプロトタイプは、Shapeそのメソッドを継承するために である必要があります。

Triangle.prototype = new Shape();

より具体的には、複数レベルの継承があるため:

TwoDShape.prototype = new Shape();
TwoDShape.prototype.constructor = TwoDShape;

Triangle.prototype = new TwoDShape();
Triangle.prototype.constructor = Triangle;

つまり、TwoDShapeを継承しShape、 からTriangle継承しTwoDShapeます。

Foo一般に、 inheritsの場合、次のBarようになります。

Foo.prototype = new Bar(); // inherit Bar
Foo.prototype.constructor = Foo; // Fix constructor which now points to Bar

デモ

参考文献:

于 2012-09-19T10:05:10.337 に答える
1

シェードのプロトタイプを、TwoDShapeやTriangleではなく、Shadeに設定する必要があります。

于 2012-09-19T10:04:02.360 に答える
0

プロトタイプの継承は であるべきでありSubConstructor.prototype = new ParentConstructor、 ではありませんSubConstructor.prototype = ParentConstructortoStringプロトタイプを正しく継承していないため、メソッドを継承しません。getAreaはプロトタイプメソッドではなく、各インスタンスの実際のプロパティであるため、機能します。

于 2012-09-19T10:05:25.180 に答える