2016-05-16 3 views
0

私はこのスーパーシンプルなJSオブジェクトを使いこなしていました。これを実行すると、「最大呼び出しスタックサイズエラー」が出るまで、obj.toStringが繰り返し呼び出されます。しかし、obj.typeの 'this'を 'this.name'に戻すと、すべて正常に動作します。私は通常、これだけを返すわけではないことを認識していますが、なぜ私はそれをループに巻き込んでいますか?ループを引き起こすJavaScriptプロトタイプで 'this'を返すのはなぜですか

var Dog = function(name){ 
    this.name = name; 
} 
Dog.prototype.type = function(){ 
    return this; 
} 
Dog.prototype.toString = function(){ 
    //console.log(this.type()) 

    return "Dog's name: " + this.type(); 
} 

var spot = new Dog('spot'); 
console.log(spot.toString()); 
+8

' "犬の名前:" ので+ this.typeは()')( 'this.typeを呼び出して終了のtoString(。 ) '(すなわち'this.toString()')を呼び出し、 'toString()'の呼び出しは 'this.type()'を再帰的に呼び出します。 –

+0

OK、私は今理解していると思います。通常、 'this'を呼び出すと、組み込みの 'toString()'メソッドが呼び出され、[object Object]のようなものが返されます。しかし、私はそれを定義して以来、私のメソッドを呼び出します。ありがとう、それは今意味があります。 – user2879070

答えて

1

javascriptでオブジェクトを文字列にすると、toString()関数が呼び出されます。

この場合、カスタムtoString()関数があります。クール。

それでは、これをトレースしてみましょう:

  1. console.log(spot.toString())
  2. return "Dog's name: " + this.type();
  3. return this;
  4. // Hmmmm. How do we add "this" to our string. Easy we call toString().
  5. return "Dog's name: " + this.type();
  6. return this;
  7. // Hmmmm. How do we add "this" to our string. Easy we call toString().
  8. return "Dog's name: " + this.type();
  9. return this;

ええとああ....

+0

ありがとう!あなたとフレデリック・ハミディの間で、どこが間違っているのか分かります。 – user2879070

-1
var Dog = function(name){ 
    this.name = name; 
} 
Dog.prototype.type = function(){ 
    return this; 
} 
Dog.prototype.getName = function(){ 
    //console.log(this.type()) 

    return "Dog's name: " + this.type(); // <- Calls toString method 
} 
Dog.prototype.toString = function(){ 
    return this.name; 
}; 

var spot = new Dog('spot'); 
console.log(spot.getName()); 
0

私はtoString方法であなたのreturn文がreturn "Dog's name: " + this.name;べきであると信じています。

関連する問題