オブジェクトからコンストラクタ関数を得る。
Object.constructorでコンストラクタ関数が取得できます。
var stdout = document.getElementById("stdout"); // Object.constructor でコンストラクタ関数が取得できる。 var Kitten = function () {}; var mii = new Kitten(); stdout.innerHTML += "mii.constructor : " + mii.constructor + "<br/>"; // function () {};
- オブジェクトを生成する際に実行されたコンストラクタ関数の参照が返されます。
- constructor属性は関数のプロトタイプで保持されています。(オブジェクトの属性ではありません。)
- 値は関数の生成時に設定されている様子。
- なので、prototypeをそっくり上書きすると消えます。
// コンストラクタプロパティは 関数のプロトタイプで保持されている。 stdout.innerHTML += "mii has? : " + mii.hasOwnProperty( "constructor" ) + "<br/>"; // false stdout.innerHTML += "Kitten has? : " + Kitten.hasOwnProperty( "constructor" ) + "<br/>"; // false stdout.innerHTML += "Kitten.prototype has? : " + Kitten.prototype.hasOwnProperty( "constructor" ) + "<br/>"; // true // 関数を生成した時点で設定されている様子。 var Dog = function () {}; stdout.innerHTML += "Dog.prototype has? : " + Dog.prototype.hasOwnProperty( "constructor" ) + "<br/>"; // true // なのでprototypeをそっくり上書きすると消える。 var Penguin = function () {}; stdout.innerHTML += "Penguin.prototype constructor : " + Penguin.prototype.constructor + "<br/>"; // function () { } Penguin.prototype = { hoge: function(){} } stdout.innerHTML += "Penguin.prototype constructor -2 : " + Penguin.prototype.constructor + "<br/>"; // function Object() { [native code] } // これでもダメ var EmperorPenguin = function () {}; stdout.innerHTML += "EmperorPenguin.prototype constructor : " + EmperorPenguin.prototype.constructor + "<br/>"; // function () { } EmperorPenguin.prototype = new Penguin(); stdout.innerHTML += "EmperorPenguin.prototype constructor -2 : " + EmperorPenguin.prototype.constructor + "<br/>"; // function Object() { [native code] }
- そっくり上書きしないようにするか、コピーしておいてやれば消えずに使えます。
- equalsで派生もともチェックしたい場合に使えそう。
//そっくり上書きしないようにするか、コピーしておいてやれば消えずに利用できる。 var Bull = function ( name ) { this.name = name; }; Bull.prototype = { constructor: Bull.prototype.constructor, // コピーしておく。 equals : function( that ) { return this.name == that.name; } }; var Bear = function ( name ) { this.name = name; } Bear.prototype.equals = function( that ) { // 上書きしない。 return this.name == that.name && this.constructor == that.constructor; } var bull = new Bull("a"); var bear = new Bear("a"); // Bullのequalsは派生もとをチェックしないので、nameプロパティの値が同じであればtrueを返す。 stdout.innerHTML += bull.equals(bear) + "<br/>"; // true // Bearのequalsは派生もとをチェックする。nameプロパティの値が同じだけではtrueにならない。 stdout.innerHTML += bear.equals(bull) + "<br/>"; // false
知らずに消しまくってた・・・orz.「そっくり上書きしない」書き方はネームスペースが長いと面倒なのでコピーのほうが好きかな。
参考:Core JavaScript 1.5 Reference:Global Objects:Object:constructor