完全に同等ではありません。
どちらの場合も、Person()グローバル名前空間で関数 (コンストラクター) を定義します。
myMethod()最初のケースでは、関数内のクロージャで新しい関数を定義しPerson()ます。通常、myMethod()関数/コンストラクターがPerson()終了すると、関数は使用できなくなります。ただし、この場合は に割り当てますthis.method。したがって、コンストラクタを実行すると
var myPerson = new Person();
新しいオブジェクトが作成され、新しいオブジェクトPerson()に設定して関数が呼び出されthisます。したがって、新しいオブジェクトは、関数がバインドされたmethodフィールドを受け取ります。myMethod
2 番目のケースでmethod2は、 内で定義されますPerson.prototype。この場合、電話をかけると
var myPerson = new Person();
新しいオブジェクト内で直接定義されたフィールドはありません ( thisfunction で何もしないためPerson)。ただし、すべてのオブジェクトには、そのプロトタイプへの参照が含まれています。オブジェクトが を呼び出して作成された場合Person()、この参照は に設定されPerson.prototypeます。したがって、オブジェクトには最終的に が含まれますがmethod2、それ自体には直接ではなく、プロトタイプに含まれます。だからあなたが電話するとき
myPerson.method2();
インタプリタはオブジェクトmethod2内myPersonを探しても何も見つからないので、 のプロトタイプを調べてmyPersonをPerson.prototype見つけmethod2、それを呼び出します。
簡単に言えば、最初にコンストラクターがメソッドを作成するため、コンストラクターを呼び出すたびに、新しいメソッドが作成され、新しいオブジェクトに挿入されます。2 番目のケースでは、メソッドはプロトタイプに格納されるため、作成するすべてのオブジェクトはメソッドの同じインスタンスへの参照を持ちます。