• ベストアンサー

javascriptのconstructorプロパティについて

constructorプロパティとは、 オブジェクトの初期化で使用されたコンストラクタ関数を参照 とのことなので、下記2パターンのPGを作成しました 1.prototypeの明記なし function Hoge(){ this.init = "Hogeで初期化"; this.getInit = function(){ return this.init; } } var obj = new Hoge(); alert(obj.constructor == Hoge); for(prop in obj){ alert( prop + " - " + obj[prop]); } //実行結果 True init - Hogeで初期化 getInit - function () { return this.init; } 2.prototypeの明記あり function Hoge(){ this.initialize.apply(this,arguments); this.init = "Hogeで初期化"; this.getInit = function(){ return this.init; } } Hoge.prototype ={ initialize:function(){ this.init = "Hoge.prototype.initializeで初期化"; }, getInit:function(){ return "Hoge.prototype.getInit()"; } } var obj = new Hoge(); alert(obj.constructor == Hoge); for(prop in obj){ alert( prop + " - " + obj[prop]); } //実行結果 false init - Hogeで初期化 getInit - function () { return this.init; } initialize - function () { this.init = "Hoge.prototype.initialize\u3067\u521D\u671F\u5316"; } ・質問内容 prototypeの明記なしの場合は、Hogeのコンストラ関数を参照している(結果がTrueのため) prototypeの明記ありの場合は、falseのためコンストラ関数を参照していないのですが、 prototype明記あり、なしで結果が異なる理由が分からない状態です。 (prototype.constructorにも手を出したのですが、上記が解決しないため  constructorプロパティに関してのみ質問した次第です) ネット、書籍等で調べたのですが、検討がつかない状態です。 お手数ですが、ご教授お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • nobuoka
  • ベストアンサー率69% (23/33)
回答No.2

> prototype でまとめて明記する場合と、 > ご回答頂いた別々に明記する方法、同等の処理だと認識しているのですが、 > まったく別物なのでしょうか? #1 の回答者じゃないですが横槍失礼します。 まず、Hoge というオブジェクト (または関数) を定義した時点で、Hoge.prototype プロパティが自動で生成されます。 初期値として constructor プロパティのみを持つオブジェクトです。 (参考 URL を参照してください。) で、prototype でまとめて明記する場合、つまり、 Hoge.prototype = { getInit: function(){ return "Foo.prototype.getInit()"; } } とする場合、Hoge.prototype には新たなオブジェクトを代入することになります。 つまり、元々 Hoge.prototype に入っていたオブジェクトは失われます。 新たなオブジェクトのコンストラクタは Object なので、 window.alert( Hoge.prototype.constructor === Object ); // => true と、Hoge.prototype.constructor の参照先は Object になっているはずです。 さらに、Hoge から生成したオブジェクト hoge の constructor プロパティは Hoge.prototype.constructor に等しいので、 var hoge = new Hoge(); window.alert( hoge.constructor === Object ); // => true となります。 一方で、#1 の回答者さんのように Hoge.prototype (の参照先のオブジェクト) に新たなメソッドを追加していく方法だと、Hoge.prototype.constructor は最初のままなので、 window.alert( Hoge.prototype.constructor === Hoge ); // => true var hoge = new Hoge(); window.alert( hoge.constructor === Hoge ); // => true となります。 参考 URL に書いたページがなかなか参考になると思いますので、一度読んでみてください。

参考URL:
http://d.hatena.ne.jp/daisun/20080524/1211617047
ques9999
質問者

お礼

ご指導ありがとうございます。 Hogeというオブジェクト関数を定義した時点で、ご指摘の ・Hoge.prototype プロパティが自動で生成 ・初期値として constructor プロパティのみを持つオブジェクト は、認識はしていたのですが、 ・Hoge.prototype には新たなオブジェクトを代入することになります。 (元々 Hoge.prototype に入っていたオブジェクトは失われます) は、把握しておりませんでした。 参考URL等も一読確認していたのですが、知識があいまいで、中々理解を深めることができなかったのですが、今回のご指摘の件で、理解できそうです。 大変参考になりました。貴重なご回答ありがとうございました。

その他の回答 (2)

回答No.3

ふかくきかないでね^^; Hoge.prototype = { }; //で、うわがき? Hoge.prototype.constructor = Hoge;//さんしょうもとをさらにうわがきしてもとにもどす

ques9999
質問者

お礼

>Hoge.prototype = { }; //で、うわがき? Hoge.prototype ={}で、メソッドの定義する場合と Hoge.prototype.メソッド = function(){}を定義する場合 の違いを理解できたので、大変参考になりました >Hoge.prototype.constructor = Hoge;//さんしょうもとをさらにうわがきしてもとにもどす 継承をする場合のサンプルソースで、 Hoge.prototype.constructor = Hoge;をよく見かけるのですが、 なぜconstructor=Hogeと明記されているのか、理解できました。 分かりやすくご返答頂き、ご指導の程ありがとうございました。

回答No.1

Hoge.prototype.initialize = function(){ this.init = "Hoge.prototype.initializeで初期化"; }; Hoge.prototype.getInit = function(){ return "Hoge.prototype.getInit()"; }; ならtrue

ques9999
質問者

お礼

ご回答ありがとうございます。 ご指摘の方法で、Hoge.prototypeのメソッドを個別に明記すると、 obj.constructor == Hoge がTrueのなったのですが、 当方の勉強不足と思いますが、 Hoge.prototype ={ initialize:function(){ this.init = "Hoge.prototype.initializeで初期化"; }, getInit:function(){ return "Hoge.prototype.getInit()"; } } 上記のようにprototypeでまとめて明記する場合と、 ご回答頂いた別々に明記する Hoge.prototype.initialize = function(){ this.init = "Hoge.prototype.initializeで初期化"; }; Hoge.prototype.getInit = function(){ return "Hoge.prototype.getInit()"; }; 方法、同等の処理だと認識しているのですが、まったく別物なのでしょうか? ご指導頂ければ幸いです。

関連するQ&A