Pergunta

Estou recebendo um erro "TestFunc não está definido" quando este pedaço 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 ();
}

... é executado a partir deste pedaço de código:

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

Solução

// 1.
this.TestFunc ();

Isso é bom. Isso vai funcionar, com as outras chamadas removidos.

(Bem, funciona, desde que você não retire a RealFunc de seu proprietário e chamá-lo por conta própria, como var method= myObj.RealFunc; method(); ou através de um manipulador de eventos ou tempo limite. Nesse this caso em RealFunc não seria o MyObject instância e você precisa olhar para encerramentos ou Function.bind para obtê-lo a trabalhar.)

// 2.
TestFunc ();

Não, TestFunc não é definido como uma variável em âmbito local ou global. Isso faz com que o erro que você recebe do Firebug.

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

Não, você estava certo. :-) Seria MyObject.prototype.TestFunc.call(this), feito explicitamente.

JavaScript faz tipo de confundir o assunto, colocando alguns dos mesmos métodos sobre as funções de construtor padrão para objetos internos como em seus protótipos (por exemplo, existe String.split onde realmente só String.prototype.split deveria). Mas isso não aconteça com seus próprios objetos a menos que você explicitamente dizer algo como MyObject.TextFunc= MyObject.prototype.TextFunc.

Outras dicas

Variante 1 parece correto. Eu tentei o seu código em ExecuteJS e saltou 2. e 3., funcionou (embora eu removido a chamada para console.log e mudou para alert). TestFunc é chamado dentro RealFunc.

O que acontece se você remover "use strict";?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top