Cuando se define una función en un constructor, se crea una nueva instancia de esa función cada vez que se llama al constructor. También tiene acceso a variables privadas.
var myClass = function() {
// private variable
var mySecret = Math.random();
// public member
this.name = "Fred";
// privileged function (created each time)
this.sayHello = function() {
return 'Hello my name is ' + this.name;
// function also has access to mySecret variable
};
}
Cuando una función se define en el prototipo, la función se crea una sola vez y la única instancia de esa función es compartida.
var myClass = function() {
// private variable
var mySecret = Math.random();
// public member
this.name = "Fred";
}
// public function (created once)
myClass.prototype.sayHello = function() {
return 'Hello my name is ' + this.name;
// function has NO access to mySecret variable
};
Por lo que la definición de una función en el prototipo produce menos objetos que pueden proporcionarle un mejor rendimiento. Por otro lado, los métodos públicos no tienen acceso a variables privadas. Más ejemplos y razonamientos están disponibles aquí: http://www.crockford.com/javascript/private.html
@aharon: Por las dudas: tenga cuidado con el uso de ['this'] (http://blog.niftysnippets.org/2008/04/you-must-remember -this.html). –
Actualicé mi respuesta para hacer más clara la diferencia entre público, privado y privilegiado. – Greg