JavaScriptではプリミティブ型でメソッドやプロパティを呼び出すという表現ができる。これは、実際には暗黙的にラッパーオブジェクトが生成されて、そのメソッドやプロパティが呼び出されている。そのため、初期化したプリミティブ型のプロパティに何か格納すると、先ほどのプリミティブ型とは別にラッパーオブジェクトが生成されてそのプロパティに格納されるため、コードの見た目上は同じスコープ、変数名だとしても2つは別ものである。

  1. var aを宣言
  2. a.fooに文字列を格納
  3. alert(a.foo)で2の値ではなく、String.prototype.fooが呼び出される

これはプリミティブ型のプロパティにアクセスする度にオブジェクトが生成されるからです。