2010-02-16 6 views
5

Estoy confundido acerca de la noción de "prototipo" en javascript.¿Cuándo debería usar "prototipo" durante el aumento de objetos en javascript?

Cuando estoy definiendo un objeto ambas de las siguientes parecen funcionar:

myObject = {}; 
myObject.prototype.method1 = function() { ... }; 
myObject.prototype.method2 = function() { ... }; 
myObject.prototype.method3 = function() { ... }; 

y ...

myObject = {}; 
myObject.method1 = function() { ... }; 
myObject.method2 = function() { ... }; 
myObject.method3 = function() { ... }; 

¿Alguien podría arrojar alguna luz sobre esto? ¿Cuál es exactamente la diferencia entre estas dos formas de crear un objeto y por qué elegiría una sobre la otra? (Tengo esta sensación en mi instinto que es importante ...)

¡Gracias!

Respuesta

8

Se debe utilizar la propiedad prototype sólo en Constructor Functions, no en instancias de objetos, por ejemplo:

function Test() {} 
Test.prototype.method1 = function() {/*...*/}; 

var obj = new Test(); 

El prototype propiedad de las funciones constructoras, es utilizado por el operador new, cuando se crea nuestro nuevo instancia de objeto.

Todos los objetos nativos tienen un enlace oculto, que desarrolla la cadena del prototipo.

Este vínculo oculto entre objetos es la propiedad interna [[Prototype]], y el operador new es el único que puede configurarlo.

En el ejemplo anterior, el obj se asocia internamente con su prototipo constructor, el method1 es accesible desde obj, pero no existe físicamente en este objeto, existe ese método en el objeto Test.prototype, y está recuperados a través de la cadena de prototipo, por ejemplo:

typeof obj.method1; // "function" 
obj.hasOwnProperty('method1'); // false 
obj.method1 === Test.prototype.method1; // true 

en instancias de objeto, la asignación de una propiedad prototype no tiene sentido, se tendrá como cualquier otro nombre de la propiedad:

var myObject = {}; 
myObject.prototype = "foo"; 
myObject.bar = "bar"; 

// myObject is simply {"prototype":"foo","bar":"bar"} 
+0

Agregaría que muchas veces habrá métodos añadidos internamente para cada instancia dentro de la función Constructor a través de: this.fn = function() {...}; que es útil para tener variables de instancia privadas a las que se accede mediante métodos de instancia. – Tracker1

1

La segunda forma agrega métodos solo a este objeto. La primera forma lo hace disponible para otros objetos creados con new con este "tipo".

Cuestiones relacionadas