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