(1)
> 下記で、property1はどこに存在しているのでしょうか?
> ・Hoge? それとも、Hoge.prototype?
method1 を呼び出す時の呼び出し方によって this が変わります。具体的には■■.method1() と呼び出した時、this は ■■ となります。通常は
var hogeInstance = new Hoge;
hogeInstance.method1(); // …(i)
などと呼び出しますので、this は hogeInstance になります。つまり、this.property1 は hogeInstance.property1 という事です。所で、もし仮に
Hoge.prototype.method1(); // …(ii) 普通はしない
とすると this は Hoge.prototype になりますので、this.property1 は Hoge.prototype.property1 を意味する事になります。普通はこの様な使い方はしませんが。また、
Hoge.method1(); // …(iii) Error
の様な呼び出し方はできません。従って、普通の使い方 (i) をしている限りは、hogeInstance.property1 などを意味すると考えて下さい。
因みに、以下の3つは全て異なる物ですので区別して下さい。
・Hoge
・Hoge.prototype
・hogeInstance などの様な Hoge のインスタンス (つまり、new Hoge で作成したオブジェクト)
(2)
> ・宣言していなければ自動的に作成される? それともHogeまで遡る?
hogeInstance.property1 が定義されていない時、
・値を読み出す時は Hoge.prototype.property1 が代わりに読み出されます。(Hoge.prototype.property1 も定義されていなければ undefined)
・値を代入する時は hogeInstance.property1 が新しく自動的に定義され、そこに値が設定されます。
(3)
> ・そもそも、this.property1はどういう意味でしょうか? これで宣言?
「this に入っているオブジェクトの property1 という名のプロパティ」という意味です。宣言ではありません。
※オブジェクトのメンバは明示的に宣言する事はありません。強いて言うならば代入の際に自動的に定義されます。従って、this.property1 = ~; と書いた時点で、未だ property1 メンバが this に定義されていなければ自動的に定義されるという事です。そういう意味で言えば "宣言+代入 と似たような効果" を持っているとも言えるかも知れません。"宣言" とは呼びませんが。
お礼
回答ありがとうございました。 大変丁寧に解説していただいので、疑問を解決することができました >method1 を呼び出す時の呼び出し方によって this が変わります ・質問したケースではthisの挙動は関係ないと思っていました ・this部分だけでは判断できない、の意味がようやく分かりました >Hoge.prototype.method1(); // …(ii) 普通はしない ・こちらのコメントも分かりやすかったです >オブジェクトのメンバは明示的に宣言する事はありません >強いて言うならば代入の際に自動的に定義されます ・大変参考になりましたー