Hatena::Groupprogram

プログラミング学習の断片

2011/11/04(Fri)

11日目 - new演算子とコンストラクタ

| 15:48

JavaScriptコンストラクタ
new演算子を用いて呼び出された関数コンストラクタと呼ぶ。
ある関数にnew演算子をつけて呼び出した時点ではじめてコンストラクタとして振舞うので、ソースコード上では通常の関数コンストラクタの区別はない。
JavaC++ のように、クラス定義時に特定の関数コンストラクタと定まっているわけではない。)
new演算子をつけてコンストラクタとして呼び出すことが想定されている関数を、便宜上、コンストラクタ関数と呼ぶ。
なお、コンストラクタ関数の名前は大文字で始めるのが慣例。

コンストラクタとなった関数の名前は、(オブジェクト名).constructor.nameで確認できる。
(ただし、nameプロパティは非標準の機能である。標準の機能としては、toString()メソッドを用いる。)
nameやtoString()でコンストラクタ関数名を取得するには、コンストラクタ関数をネームド関数にする必要があるが、instanceof演算子による判別はコンストラクタが無名関数でも可能である。

function MyObject1() {};
var MyObject2 = function () {};

var bar = new MyObject1();
var baz = new MyObject2();

alert(bar.constructor.name); // "MyObject1"
alert(baz.constructor.name); // "" コンストラクタが無名関数

alert(bar.constructor.toString()); // "function MyObject1(){}"
alert(baz.constructor.toString()); // "function (){}" コンストラクタが無名関数

alert(bar instanceof MyObject1); // true
alert(baz instanceof MyObject2); // true

・new演算子の働き
ある関数Fを、new演算子を用いてコンストラクタとして呼び出した場合、以下のような処理を行う。(引用)

  1. 新しいオブジェクトを作る。
  2. 1 で作ったオブジェクトの [[Prototype]] 内部プロパティ (__proto__ プロパティ) に F.prototype の値を設定する。
  3. F を呼び出す。このとき this の値は 1 で作ったオブジェクトとし、引数には new 演算子とともに使われた引数をそのまま用いる。
  4. 3 の返り値がオブジェクトならそれを返す。そうでなければ 1 で作ったオブジェクトを返す。


参考文献
http://nanto.asablo.jp/blog/2005/10/24/118564
http://d.hatena.ne.jp/kaw0909/20100801/1280662055