Pregunta

Estoy recibiendo un error "TestFunc no está definido" cuando este trozo de código ...

/* my_object.js */
"use strict";
function MyObject (param) {
    this.param = param;
}

MyObject.prototype.TestFunc = function () {
    console.log ('in TestFunc');
}

MyObject.prototype.RealFunc = function () {
    // I have tried 3 different ways to call TestFunc:
    // 1.
    this.TestFunc ();

    // 2.
    TestFunc ();

    // 3. (I didn't really think this would work,
    //     but thought it was worth a try...)
    MyObject.TestFunc ();
}

... se ejecute de este trozo de código:

/* index.js */
var myObj = new MyObject ('test');
myObj.RealFunc (); // Firebug: "TestFunc is not defined"
¿Fue útil?

Solución

// 1.
this.TestFunc ();

Eso está bien. Eso funcionará, con las otras llamadas eliminadas.

(Bueno, funciona siempre y cuando no se retire la RealFunc de su dueño y lo llama por su propia cuenta, como var method= myObj.RealFunc; method(); o por medio de un controlador de eventos o tiempo de espera. En ese caso this en RealFunc no sería la MiObjeto instancia y que había necesidad de mirar a cierres o Function.bind para conseguir que funcione.)

// 2.
TestFunc ();

No, TestFunc no se define como una variable de alcance local o global. Esto hace que el error que se obtiene de Firebug.

// 3. (I didn't really think this would work,
//     but thought it was worth a try...)
MyObject.TestFunc ();

No, tenías razón. :-) Sería MyObject.prototype.TestFunc.call(this), hecho de forma explícita.

JavaScript qué tipo de confundir el asunto poniendo algunos de los mismos métodos de las funciones constructoras estándar para los objetos incorporados como en sus prototipos (por ejemplo, existe String.split donde realmente sólo String.prototype.split debería). Pero eso no sucede a sus propios objetos a menos que se diga explícitamente algo así como MyObject.TextFunc= MyObject.prototype.TextFunc.

Otros consejos

Variante 1 parece correcta. Probé el código en ExecuteJS y salté 2. y 3., funcionó (aunque me quita la llamada a console.log y lo cambió a alert). TestFunc se llama dentro de RealFunc.

¿Qué ocurre si se quita "use strict";?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top