Normalmente, he visto prototipos de las funciones declaradas fuera de la definición de clase, así:configuración de JavaScript prototipo de la función dentro de la declaración de clase de objeto
function Container(param) {
this.member = param;
}
Container.prototype.stamp = function (string) {
return this.member + string;
}
var container1 = new Container('A');
alert(container1.member);
alert(container1.stamp('X'));
Este código produce dos alertas con los valores "A" y "AX" .
Me gustaría definir la función prototipo DENTRO de la definición de la clase. ¿Hay algo de malo en hacer algo como esto?
function Container(param) {
this.member = param;
if (!Container.prototype.stamp) {
Container.prototype.stamp = function() {
return this.member + string;
}
}
}
Estaba intentando esto para poder acceder a una variable privada de la clase. Pero he descubierto que si mi prototipo de la función hace referencia a una var privada, el valor de la variable privada es siempre el valor que se utilizó cuando la función prototipo fue creado inicialmente, no el valor en la instancia del objeto:
Container = function(param) {
this.member = param;
var privateVar = param;
if (!Container.prototype.stamp) {
Container.prototype.stamp = function(string) {
return privateVar + this.member + string;
}
}
}
var container1 = new Container('A');
var container2 = new Container('B');
alert(container1.stamp('X'));
alert(container2.stamp('X'));
Este código produce dos alertas con los valores "AAX" y "ABX". Esperaba que la salida fuera "AAX" y "BBX". Tengo curiosidad de por qué esto no funciona, y si hay algún otro patrón que pueda usar en su lugar.
EDIT: Tenga en cuenta que estoy totalmente de entender que para este ejemplo sencillo sería mejor utilizar sólo un cierre como this.stamp = function() {}
y no utilizar prototipo en absoluto. Así es como yo lo haría también. Pero estaba experimentando con el uso de prototipos para obtener más información al respecto y me gustaría saber algunas cosas:
- ¿Cuándo tiene sentido utilizar prototipos en lugar de cierres? Solo necesito usarlos para extender objetos existentes, como
Date
. He leído que closures are faster. - Si necesito usar una función de prototipo por algún motivo, ¿es "correcto" definirla DENTRO de la clase, como en mi ejemplo, o debería definirse en el exterior?
- Me gustaría entender por qué el valor de privateVar de cada instancia no es accesible para la función de prototipo, solo el valor de la primera instancia.
cierres tachado de nuevo ... – Dormilich
leer sobre los cierres (http://www.jibbering.com/faq/faq_notes/closures.html) por razones detalladas por las que su código se comporta de la manera que lo hace. – outis