Creo que probablemente está ejecutando en el tema de cómo y cuándo se producen las declaraciones de función frente al código paso a paso (lo que llama la especificación código de instrucción).
código como éste fallará en la forma en que usted describe, por ejemplo:
var obj = new Thingy("Fred");
function Thingy(name) {
this.setName(name);
}
Thingy.prototype.setName = function(name) {
this.name = name;
};
... porque usted está llamando al constructor antes de añadir la función setName
al prototipo. Tenga en cuenta que llamar al constructor antes de su declaración está bien, es solo porque el constructor está usando una función que está configurada más tarde por el código de la declaración de que hay un problema. El orden en el que el intérprete de JavaScript tratará de procesar que el código es:
- crear la función
Thingy
y ponerla a disposición de la mira telescópica.
- Ejecute la línea
var obj = ....
, llamando al constructor.
- Ejecute el código del constructor (que en este caso arroja una excepción porque no hay una función
this.setName
).
- Ejecute la línea
Thingy.prototype.setName = ...
. (Si no se ha lanzado ninguna excepción en el último paso, es decir)
Estos pasos ocurren para cada bloque de scripts (primero se realizan las declaraciones de función, luego se ejecuta el código de instrucción en orden), y aunque el ejemplo anterior es bastante obvio, cuando comienzas a juntar piezas de diferentes ubicaciones, puedes crear esta situación de forma menos obvia.
La solución, por supuesto, es asegurarse de que usted no está construyendo el objeto antes de que haya configurado la propiedad setName
:
function Thingy(name) {
this.setName(name);
}
Thingy.prototype.setName = function(name) {
this.name = name;
};
var obj = new Thingy("Fred");
... y otra vez, lo anterior es bastante obvio, pero es posible crear estas situaciones de forma menos obvia en el mundo real.
Mi sospecha es que esto es lo que está sucediendo en su caso. Es fácil de probar: utilizar un depurador como Firebug en Firefox, VS.Net o el Script Debugger para IE, DevTools de Chrome, etc., ponga un punto de interrupción en la línea SystemList.prototype.refreshData = ...
y un punto de interrupción en la línea donde está haciendo su new SystemList(...)
y vea cuál se ejecuta primero.
Aquí hay un par de violines que demuestran el problema: This one falla en el constructor, this one tiene éxito.
Agregué un ejemplo de cómo creo el obj. – nazbot
¿Estás seguro de que estás usando el constructor 'SystemList' * después de * aumentar su prototipo? – CMS
funciona para mí: http://jsbin.com/ebasa/edit – nickf