1

以下のコードがどのように機能するかを理解しようとしています。「親のプロトタイプ オブジェクトを指す uber プロパティを作成する」という言葉の意味を誰か説明できますか? 「this.constructor.uber」が親のプロトタイプを指しているとはどういう意味ですか? しばらく頭をかいてます。関数 Shape() で何が起こっているのか誰かが説明してくれたら本当にありがたいです。

function Shape() {}
// augment prototype
Shape.prototype.name = 'shape';
Shape.prototype.toString = function () {
    var result = [];
    if (this.constructor.uber) {
        result[result.length] = this.constructor.uber.toString();
    }
    result[result.length] = this.name;
    return result.join(', ');
};


function TwoDShape() {}
// take care of inheritance
var F = function () {};
F.prototype = Shape.prototype;
TwoDShape.prototype = new F();
TwoDShape.prototype.constructor = TwoDShape;
TwoDShape.uber = Shape.prototype;
// augment prototype
TwoDShape.prototype.name = '2D shape';

function Triangle(side, height) {
    this.side = side;
    this.height = height;
}
// take care of inheritance
var F = function () {};
F.prototype = TwoDShape.prototype;
Triangle.prototype = new F();
Triangle.prototype.constructor = Triangle;
Triangle.uber = TwoDShape.prototype;
// augment prototype
Triangle.prototype.name = 'Triangle';
Triangle.prototype.getArea = function () {
    return this.side * this.height / 2;
}

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

出力:"shape,2Dshape,Triangle"

4

1 に答える 1

1

Javascriptの継承では、superメソッドへのアクセスはサポートされていないため、ここでuberで確認できるのは、その親メソッドにアクセスできることです。
次のように親に名前を付けます。
TwoDShape.parent = Shape.prototype

そうすれば、親プロパティに直接アクセスできます。TwoDShape.parent.nameを返す必要があり'shape'ます。

ここtoString()で実際に行っていることは次のとおりです。

var result = []; //declare an array
if (this.constructor.parent) { //if there is a parent prototype
    result[0] = this.constructor.parent.toString(); //set the 0 position of result with the return value of parent's toString() method.
}
result[result.length] = this.name; //set the position (0 or 1, if we had a parent it will be 1, otherwise 0) with the current name.
return result.join(', '); //return the names joined with a comma

を読みやすくuberするために変更したことに注意してください。parent結果の最初の割り当ては常に0になるため、を呼び出す必要はありませんでしたresult.length

各オブジェクトの呼び出しは何を返しますか?
Shape.toString();::(親'shape'はありません)
TwoDShape.toString();:(への呼び出しとそれ自体の名前の場合は結合されます)。:(への呼び出しのために、そしてそれ自身の名前のために、参加しました)。'shape, 2D shape''shape'Shape.toString();'2D shape'
Triangle.toString();'shape, 2D shape, Triangle''shape, 2D shape'TwoDShape.toString();'Triangle'

于 2012-10-28T01:13:19.323 に答える