2012-10-19 16 views
5

私はJavaScriptでコードブロックを作成します。Javascriptの継承無限ループ

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


function twoDShape() {}; 
twoDShape.prototype = new Shape(); 
twoDShape.prototype.constructor = twoDShape; 

twoDShape.uber = twoDShape.prototype; 
twoDShape.name = "twoD Shape"; 

var a = new twoDShape(); 
console.log(a.toString()); 

私はなぜ知らないが、私はそれを実行すると、Firefoxがフリーズです。私はそれを理解する時間を試してきました。私の推測では、コード内に無限ループがあるはずですが、if条件のどこかに住んでいますが、私はそれを見つけられませんでした。誰かがこの頭痛から私を助けることができますか? ありがとうございました!

答えて

2

あなたはShape.prototype.toStringからthis.constructor.uber.toString()を呼び出し、uberShapeあるtwoDShape.prototypeあり、そしてそのためtoString方法は再びShape.prototype.toStringです。

これは、無限ループを引き起こします。

0

よく、かなりの量のテストを試した後、私はついに手がかりを得ました。そして、私はこれが上記の私自身の質問に対する答えだと信じています。入力:a.constructor.uber.constructor === twoDShape in firefox、trueを返します。それが無限ループの原因です。

+0

正確に言えば、上記の私の答えに従って、toStringメソッドでループしています。同じコンストラクタは、なぜこれが起こっているのか(メソッド自体を呼び出す)、実際にはループの原因ではありません。 – sync