オブジェクトとプリミティブ

色々参考書を読んでいくと、頭が混乱してきたので、自分の為のメモ

1

var str = "test" ;
str.say = "hello" ;
alert( str ) ;         // testと表示
alert( str.say ) ;     // undefindと表示

2

var str = {} ;
str.say = "hello" ;
alert( str ) ;         // Objectと表示
alert( str.say ) ;     // helloと表示

上のコードと下のコードを自分なりに一番わかりやすく調べる。

3

var str = "test" ;
alert( typeof str ) ;  // String
var str = {} ;
alert( typeof str ) ;  // Object
var str="test";
str.toString = "convert string" ;
alert( str.toString ) ;     //function toString() { [native code] } と表示

1と2の違い、
1では、strはプリミティブになる。
2では、strはオブジェクトになる。
javascriptでは、オブジェクトには、プロパティ値を設定できるが、プリミティブ値には、プロパティ値を設定できない。なので、1のコードでは、undefindと表示されてしまうのだ。
ちなみにプリミティブとは、クラスのようなものになる。なので、1のstrは、String型のクラスそのものになる。また、3のコードで、str.toStringを設定しようとしたが、表示した結果が function ~~~ みたいになるのは、もともとあるjavascriptのStringオブジェクトのtoString関数が呼ばれてしまったせいである。
という事は、1のコードで、str.sayというプロパティ値を設定したいのであれば、strを以下のようにオブジェクトとして、宣言すればよい。

var str = new String("test") ;
str.say = "hello" ;
alert( str ) ;        // testと表示
alert( str.say ) ;  // helloと表示