JavaScriptのオブジェクトを理解する ②
フロントエンド強化月間。勉強アウトプット。
コンストラクタの定義
var Member = function(firstName, lastName, age) { this.firstName = firstName; this.lastName = lastName; this.age = age; this.getInfo = function() { return '氏名:' + this.lastName + '' + this.firstName + '(' + this.age + '歳)'; } } var jsman = new Member('man', 'js', 24); console.log(jsman.getInfo()); // 氏名: js man(24歳)
通常、JavaScriptでは、関数内で呼び出すthisは関数呼び出し元のオブジェクトを参照する。
new演算子を使ってインスタンス化した場合、thisはそのインスタンス自信を指す。
オブジェクトとプリミティブ型について
プリミティブ型(boolean, number, string, null, undefined)は通常、値そのものを指すが、一時的にオブジェクトになっているケースがある。
var num = 100; var num2 = new Number(100); console.log(typeof num); // number console.log(typeof num2); // Object console.log(num.toString()); // 100 console.log(num2.toString()); // 100
まず、typeof(値の型を調べる演算子)の結果を見ると
numは数値リテラルを代入しただけなので、プリミティブ型(number)であるのに対して、
num2はnew演算子を使ってNumberコンストラクタを呼び出したので、Numberオブジェクトのインスタンス(object)が格納されている。
次に、それぞれの変数のtoString()の結果を見ると
プリミティブ型であるnumも、toString()を呼び出せていることがわかる。
(オブジェクトかのように振舞っている)
number, string, booleanのプリミティブ型には、それぞれラッパーオブジェクトが存在する。
JavaScriptのプリミティブ型は、オブジェクトとして振る舞おうとした時に、バックグラウンドでそれぞれの型に応じたラッパーオブジェクトを生成する。
そしてオブジェクトとしての振る舞いが完了すると、ラッパーオブジェクトは破棄され、値は元のプリミティブ型に戻る。
「JavaScriptではほぼ全てのものがオブジェクトか、オブジェクトのように振る舞う」と言うことができる。
nullとundefinedに関してはラッパーオブジェクトを持っていないため、いつでもプリミティブな存在となるため、メソッドの呼び出しやプロパティの取得はできない。