No es totalmente equivalente.
En ambos casos, se define una función (constructor) Person()
en el espacio de nombres global.
En el primer caso, define una nueva función myMethod()
en un cierre dentro de la función Person()
. Normalmente, la función myMethod()
no estaría disponible después de la función/constructor Person()
acabados. Sin embargo, en este caso, lo asigna al this.method
. Por lo tanto, cuando se ejecuta el constructor se crea
var myPerson = new Person();
Un nuevo objeto, entonces la función se llama con Person()
this
conjunto al nuevo objeto. Por lo tanto, el nuevo objeto recibe un campo method
con myMethod
función fijado a ella.
En el segundo caso, method2
se define dentro del Person.prototype
. En este caso, cuando se llama
var myPerson = new Person();
no habrá ningún campo definido directamente dentro de su nuevo objeto (como usted no hace nada con this
en la función Person
). Sin embargo, cada objeto contiene una referencia a su prototipo. Si el objeto se crea llamando Person()
, esta referencia se establece en Person.prototype
. Por lo tanto, su objeto contendrá finalmente method2
, aunque no directamente en sí mismo, sino en el prototipo. Así que cuando se llama a
myPerson.method2();
el intérprete busca method2
dentro del objeto myPerson
y no encuentra nada, entonces se ve en el prototipo de myPerson
, que es Person.prototype
y se encuentra method2
, por lo que lo llama.
Larga historia corta: en la primera el constructor crea el método, por lo que cada vez que se llama al constructor, se crea un nuevo método y se inserta al nuevo objeto. En el segundo caso, el método se almacena en el prototipo, por lo que cada objeto que cree tendrá la referencia a la misma instancia de su método.
posible duplicado de [Uso de 'prototipo' frente a 'esto' en Javascript?] (Http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript) –
[ declarando javascript método de objeto en el vs. función constructora de prototipo] (http://stackoverflow.com/questions/9772307/declaring-javascript-object-method-in-constructor-function-vs-in-prototype) –