■ constructorプロパティの利用
JavaScriptでは、constructorプロパティを呼ぶことで自分を生成したオブジェクトのコンストラクタ関数を呼ぶことが出来ます。
- function MyObject(x) {
- this.x = x;
- }
- var my = new MyObject(1);
- document.writeln("MyObject: " + my.constructor);
このような結果になります。
- MyObject: function MyObj(x) { this.x = x; }
これは、定義した関数を表示しただけなので元の関数を変数として使用したものと同じ結果になります。
- document.writeln((my.constructor == MyObj)); <i class="comment">// true</i>
これを使用してインスタンスの直接のオブジェクトが調べられます。
- var arr = new Array(1, 2, 3, 4, 5);
- document.writeln(arr.constructor == Array); <i class="comment">// true</i>
- document.writeln(arr.constructor == Object); <i class="comment">// false</i>
- document.writeln(arr instanceof Object); <i class="comment">// true //instanceof演算子だとスーパークラスにもtrueになる</i>
また基本型もラップされてラッパーオブジェクトとして評価されます。
- document.writeln((1).constructor == Number); <i class="comment">// true</i>
- document.writeln(("文字列").constuctor == String); <i class="comment">// true</i>
- document.writeln((function() {}).constructor == Function); <i class="comment">// true</i>
以上からconstructorプロパティはインスタンスが何のオブジェクトから生成されたか判定できるので有用です。
■ Objectオブジェクトの不思議な挙動
Objectオブジェクトのインスタンスでconstructorプロパティを生成する場合、引数を入れたObjectのインスタンスと比べるとエラーになります。
- var obj = new Object();
- document.writeln(obj.constructor == Object); <i class="comment">// true</i>
- obj = new Object(1);
- document.writeln(obj.constructor == Object); <i class="comment">// false</i>
なんだか変ですね。
参考:https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/Object/constructor