オブジェクトを生成する
・javascriptはjavaやC++のように、クラス定義をせず、オブジェクトを作ることができる
・javascriptにおけるコンストラクタ関数の例を以下に示す。
var Person = function(living, age, gender){
this.living = living;
this.age = age;
this.gender = gender;
this.getGender = function(){
return this.gender;
};
};
//インスタンスの生成
var cody = new Person(true, 33, 'male');
var lisa = new Person(true, 34, 'female');
new演算子を伴って呼ばれた場合、オブジェクトが生成される。オブジェクトの特徴を次の項目で確認していく。
*ちなみにコンストラクタ関数に使用する関数の名前は、通常の関数との混同を避けるために最初の文字を大文字にする。
オブジェクト ≠ プリミティブ
プリミティブとオブジェクトは違う。プリミティブ型は「そのデータ型の定義の中に部分として他の型を含まないような型」という定義である。 null, undefined, 'string',10,ture,falseはプリミティブ型である。以下の例をみると、オブジェクトとプリミティブの違いがわかる。
var a = 10;
var b = new Number('10');
console.log(a); //出力 : 10
console.log(b); //出力 : Number { 10 }
console.log(a === b); //出力 : false
/*JavaScriptではいつでもオブジェクトにプロパティやメソッドを追加することができる(ただしオブジェクトに限る)これを動的プロパティという*/
a.key = 20; //プリミティブ型は新しく値を格納することができない
b.key = 20; //オブジェクトは新しい値を格納することができる
console.log(a); //出力 : 10
console.log(b); //出力 : Number { 10, key: 20 }
また、新たにプロパティを追加しているのが確認できたと思うが、JavaScriptのオブジェクトのプロパティは可変(ミュータブル)である。これが、JavaScriptの強みなのではないか。
オブジェクトのコピーは参照
オブジェクトは参照によって保存される。以下のコードを
var objA = {a : 'A'};
var objB = objA;
var objC = {a : 'C'};
console.log(objA === objB); //出力 : true
console.log(objA === objC); //出力 : false オブジェクトは同値判定に参照を使用するため中身が同じオブジェクト同士でも同値とみなされない
objA.b = 'B'
console.log(objB); //出力 : Object { a: "A", b: "B" }
console.log(objA === objB); //出力 : true
var objD = objB;
console.log(objA,objB,objD); //出力 : Object { a: "A", b: "B" } Object { a: "A", b: "B" } Object { a: "A", b: "B" }
objA.a = 'B'; // 出力 :
console.log(objA,objB,objD); //出力 : Object { a: "B", b: "B" } Object { a: "A", b: "B" } Object { a: "A", b: "B" }
・プリミティブ型の変数には、値が格納される。プリミティブ型の変数がコピーされると、文字通り変数が複製されるが、オブジェクトを格納する変数には、実際にはオブジェクトへの参照が格納される。したがってこれがコピーされると、変数の値自体ではなく、参照がコピーされる。
・プリミティブ型の変数を同値比較(===)する場合は、それらの値が同じであれば同値とみなされるが、オブジェクトを同値比較する場合は、同じ参照値を持っている場合のみに同値とみなされる。つまり、同じオブジェクトを参照している場合のみに同値とみなされる。
リファレンス
開眼!JavaScript(第1章) (https://www.oreilly.co.jp/books/9784873116211/)