2011-08-18 12 views
12

En Javascript, ¿hay alguna diferencia entre estas dos formas de agregar una función a un objeto? ¿Es preferible por alguna razón?Diferentes formas de agregar funciones al objeto Javascript

function ObjA() { 
    this.AlertA = function() { alert("A"); }; 
} 
ObjA.prototype.AlertB = function() { alert("B"); }; 

var A = new ObjA(); 
A.AlertA(); 
A.AlertB(); 
+0

Posible duplicado: http://stackoverflow.com/questions/422476/javascript-setting-methods-through-prototype-object-or-in-constructor-differenc –

+0

Duplicado de hecho, gracias. –

+0

posible duplicado de [Uso de 'prototipo' frente a 'esto' en JavaScript?] (Http://stackoverflow.com/questions/310870/use-of-prototype-vs-this-in-javascript) – user2864740

Respuesta

16

Claro que hay una diferencia. Si define this.AlertA, está definiendo un método que es local para la instancia de ObjA. Si agrega AlertA al prototipo del ObjAconstructor, se define para cada instancia de ObjA. Este último es, en este caso, más eficiente, porque solo se asigna una vez, mientras que se asigna un método local cada vez que crea una instancia de ObjA.

Así, utilizando this.AlertA en:

var A = new ObjA, 
    B = new ObjA, 
    C = new ObjA; 

para A, B y C, el constructor tiene que añadir el método AlertA. AlertB por otro lado, solo se agrega una vez. Puede verificar que utilizando:

function ObjA() { 
     alert('adding AlertA!'); 
     this.AlertA = function() { 
      alert("A"); 
     }; 

     if (!ObjA.prototype.AlertB) { 
      alert('adding AlertB!'); 
      ObjA.prototype.AlertB = function() { 
       alert("B"); 
      }; 
     } 
} 

var A = new ObjA, //=> alerts adding AlertA! and alerts adding AlertB! 
    B = new ObjA, //=> alerts adding AlertA! 
    C = new ObjA; //=> alerts adding AlertA! 
3

El uso del constructor de objetos asignará una copia de esa función a cada nueva instancia de su objeto. El uso de prototipos dará como resultado que una función se comparta en todas las instancias.

Cuestiones relacionadas