概要
JavaScriptのコンストラクタについて調べる
JavaScript勉強シリーズ
- JavaScriptのthisについてメモ
- JavaScriptのコンストラクタについて
- JavaScriptのwindowについてのメモ
- JavaScriptのプロトタイプ継承について
- JavaScriptのプロトタイプチェーンについてメモ
- JavaScriptのスコープについてメモ
- JavaScriptの論理演算による存在チェックについて
- JavaScriptのクロージャについてメモ
- JavaScriptのグローバル変数の衝突について
コンストラクタについて
コンストラクタとはオブジェクト生成のために使う関数です
コンストラクタ呼び出し時には「new」を使ってインスタンスオブジェクトを生成します
通常の関数とコンストラクタの違いは呼び出し方による違いだけなので
どんな関数でも「new」で呼び出せばそれはコンストラクタになります
コンストラクタの例
// コンストラクタ function TestClass(x) { this.x = x; } // コンストラクタの呼び出し var obj = new TestClass(3); print(obj.x); // 3
慣習的にコンストラクタ名は(TestClassのように)大文字で始めます
コンストラクタ呼び出し時の挙動について
newを使ってコンストラクタ呼び出しが行われた場合の挙動については以下の処理が行われます
- 空のオブジェクトが作成される
- newで指定した関数(コンストラクタ)が呼ばれる
- 2呼ばれたコンストラクタのthisは1で作成した空のオブジェクトを参照する
- コンストラクタを実行
- コンストラクタの戻り値としてオブジェクトの参照が返る
コードで表現すると
最初にthisを宣言して返り値にthisを指定しているのと同じ動きになる
function TestClass(x) { // var this = {}; this.x = x; // return this; }
明示的にreturnを記述した場合の挙動について
コンストラクタはreturn thisがあるかのような動作をしますが
コンストラクタ内に実際にreturnがあると以下のような動作になります
returnで何を返すか | コンストラクタを呼んだ際の評価値 |
return (オブジェクト) | オブジェクト |
return (基本型) | this |
なので以下のような挙動を起こします
// returnでオブジェクトを記述すると // objにはそのオブジェクトが入る function TestClass1() { this.x = 5; return {x:3, y:2} } var obj1 = new TestClass1(); print(obj1.x, obj1.y); // 3 2 (5ではないことに注意) print(typeof obj1); //object // returnに基本型を記述すると // objにはthis参照が入る function TestClass2() { this.x = 1; return 5; } var obj2 = new TestClass2(); print(obj2); // [object Object] (5ではないことに注意) print(obj2.x); // 1 print(typeof obj2); // オブジェクト
参考
- パーフェクトJavaSctipt (書籍)
- JavaScriptのクラス?コンストラクタ??
コメントを書く
コメント一覧