2012-03-09 9 views
9

me encontré con este post http://www.webmasterworld.com/javascript/3066162.htm acerca de cómo en javascript cuando una instancia de un objeto literal si se dispone de métodos definidos en él, entonces cada vez que uno se crea una instancia sus métodos se copian también. entonces, si tiene un montón de instancias del objeto literal, entonces los métodos copiados comenzarían a sumarse en la memoria.notación literal de objetos vs velocidad de prototipo y la memoria

como sea que él/ella declare que usar prototipos para hacer sus métodos es más eficiente porque los métodos no se copian para cada instancia del objeto constructor.

¿Es esto cierto? porque tenía la impresión de que el prototipo le permitía agregar propiedades/métodos incluso después de la instancia del objeto en lugar de hacerlo dentro del objeto cuando se creó por primera vez.

+2

Solo quiero señalar que crear un método desde dentro del constructor no hace una nueva copia de todo el método en la memoria, simplemente se hace una nueva referencia al método existente.Sin embargo, los prototipos aún tienden a ser más rápidos porque todo esto lo maneja el motor de JavaScript, por lo que puede generar muchas optimizaciones en el camino, que rápidamente se hacen evidentes al crear instancias de decenas de miles de objetos. Google optimizó la mierda de la cadena de prototipos en V8, que es en parte por qué es tan rápido. –

+0

@musicfreak eso es bueno saberlo, gracias hombre. – zero

Respuesta

10

Es cierto, es por eso que hay un prototype.

// define Function foo 
function Foo() 
{ 
    this.x = 1; 
    this.bar = 'bar'; 
} 

// define method on Foo's prototype 
Foo.prototype.helloBar = function() 
{ 
    alert(this.bar); 
} 


var foobar = new Foo(); 

foobar.helloBar(); // alerts "bar" 

Usando Foo.prototype impide que los bits adicionales innecesarios asociados con la redefinición de hellobar para cada instancia new Foo().

+0

supongo que estoy confundido. es un prototipo a lo que cada instancia del objeto hace referencia (algo así como llamar a una función) – zero

+3

@codewombat: Eso es correcto. El objeto 'prototype' se comparte entre todos los objetos creados a partir de la misma función de constructor. * Se refieren * a ella para acceder a propiedades que no son de su propiedad. –

+0

En este caso, *** todos los objetos de la función Foo ***. – xandercoded

14

Cuando se crea un objeto como éste:

function Car(c) { 
    this.color = c; 
    this.drive = function() {}; 
} 

En realidad estás creando una copia de la función de conducción de cada vehículo que se crea. En Javascript, cada objeto tiene un puntero prototipo y las propiedades/métodos de ese prototipo se propagan por el árbol a objetos secundarios.

Al hacer:

function Car(c) {this.color=c}; 
Car.prototype.drive = function {}; 

y luego crear un coche pocos objetos que termina con esto en su lugar:

 
      {drive: function(){}} 
      /  |   \ 
     car1 (red) car2 (blue) car3 (green) 

La función drive se comparte entre todos los objetos de coches. Es una pena que la sintaxis para hacer esto en Javascript sea tan incómoda.

+0

⇈ Esta es la buena respuesta. – Daniel

1

La definición de métodos en el prototipo de una función de constructor es similar a una definición de clase en otros idiomas. Los métodos definidos en una clase de Java, por ejemplo, son compartidos por todas las instancias de esa clase. Los métodos definidos en el prototipo de una función de constructor, en Javascript, son compartidos por todas las instancias creadas a partir de esa función de constructor.

La principal diferencia en el ejemplo anterior son las declaraciones de variables. Una variable que se define en un prototipo se compartirá entre instancias en las que cada instancia de una clase tendrá su propia copia de las variables en la definición de clase.

La forma más fácil de entender sería a través de algunos experimentos. http://jsfiddle.net/3vn4A/

En Firefox, los objetos pueden acceder a su prototipo directamente a través del puntero __proto__. Object.getPrototypeOf(obj) es la forma estándar para que un objeto se refiera programáticamente a su prototipo.

Cuestiones relacionadas