2012-10-19 17 views
5

Ich schaffe diese Code-Block in javascript:Javascript Vererbung Endlosschleife

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()); 

Ich weiß nicht, warum, aber wenn ich es laufen, firefox ist einfrieren. Ich habe Stunden damit verbracht, es herauszufinden. Und meine Vermutung ist, es sollte eine unendliche Schleifen in meinem Code geben und es lebt irgendwo in der if-Bedingung, aber ich habe es nicht herausgefunden. Könnte mir jemand aus diesen Kopfschmerzen helfen? Vielen Dank!

Antwort

2

Wenn Sie this.constructor.uber.toString() von Shape.prototype.toString nennen, uber ist twoDShape.prototype die ein Shape ist, und so, dass toString Methode ist Shape.prototype.toString wieder.

Und das verursacht eine Endlosschleife.

0

Nun, nachdem ich eine ordentliche Menge an Test versucht hatte, bekam ich endlich einen Hinweis. Und ich glaube, das ist eine Antwort auf meine eigene Frage oben. Typisierung: a.constructor.uber.constructor === twoDShape in Firefox, gibt true zurück. Und deshalb verursacht es Endlosschleife.

+0

Um genau zu sein, ist es in der toString-Methode wie meine obige Antwort Schleife. Die Konstruktoren, die die gleichen sind, sind der Grund dafür (die Methode nennt sich selbst), ist aber nicht der eigentliche Grund für die Schleife. – sync