コンストラクタがよく分からなくなりました

http://blog.xole.net/article.php?id=640を読みました。
そして実際に手を動かしながら理解しようと試みました。
でもどうしても納得できないところが1つ残ってしまいました。
以下は納得できないところを抜粋したもので
コンストラクタの説明に使われているコードの一部です。

var Foo = function(msg){
    this.toString = function (){
        return msg + ' is Foo';
    }
    return msg;
};  

var foo2 = new Foo('def');
alert(foo2); // def is Foo ← ここが納得できない!
alert(foo2.toString()); // def is Foo

alert(foo2) で出力されるのは [object Object] だと思うのですが
予想に反して def is Foo が出力されます。
でもどうしてそうなるのかがサッパリ分かりません。
一体何がどうなってこのようになっているのかスッキリしたい!


ところで、リンク先のページは700以上もブクマされていて
コメントでも「分かりやすい」という反応が多いようですが
個人的にはそれほど分かりやすいとは思いません。
たしかに内容はよくまとまっているし
JavaScriptを学ぶためのとっかかりとしても大変よいエントリだと思います。
でもソースには関数の複雑な入れ子構造*1がいくつもあって
僕は中々理解することができませんでした。
ただそれは、単に僕の頭が悪いとか
僕がそういう考え方に慣れていないだけかもしれません。
もう少し勉強してからまたもう一度読み直してみようと思います。

追記

コメントを頂いて納得することができました。
理由は、以下の2点です。

  • alert は引数を文字列として評価する。
  • オブジェクトが文字列として評価される場合、自動的に toString が呼ばれる。

上記の理由により、alert(foo2) が alert(foo2.toString()) となるため
"def is Foo" が出力されるのです。
やったースッキリしたー(・∀・)

*1:関数が関数を返す関数を返す、とかそういう構造