Question

Je reçois un « TestFunc n'est pas défini » erreur lorsque ce bit de code ...

/* 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 ();
}

... obtient courir à partir de ce morceau de code:

/* index.js */
var myObj = new MyObject ('test');
myObj.RealFunc (); // Firebug: "TestFunc is not defined"
Était-ce utile?

La solution

// 1.
this.TestFunc ();

Très bien. Ça va travailler, avec les autres appels supprimés.

(Eh bien, il fonctionne aussi longtemps que vous ne retirez pas le RealFunc de son propriétaire et appelez sur lui-même, comme var method= myObj.RealFunc; method(); ou via un gestionnaire d'événements ou délai d'attente. Dans ce this cas dans RealFunc ne serait pas le MyObject instance et vous aurez besoin de regarder les fermetures ou Function.bind pour le faire fonctionner.)

// 2.
TestFunc ();

Nope, TestFunc ne se définit pas comme une variable portée locale ou globale. Cela provoque l'erreur que vous obtenez de Firebug.

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

Non, vous aviez raison. :-) Il serait MyObject.prototype.TestFunc.call(this), fait explicitement.

JavaScript ne confondez nature de la question en mettant quelques-uns des mêmes méthodes sur les fonctions constructeur standard des objets intégrés comme sur leurs prototypes (par exemple String.split existe où vraiment que String.prototype.split devrait). Mais cela ne se produit pas à vos propres objets à moins que vous dites explicitement quelque chose comme MyObject.TextFunc= MyObject.prototype.TextFunc.

Autres conseils

Variante 1 semble correct. J'ai essayé votre code dans ExecuteJS et sautais 2. et 3., il a travaillé (même si je l'ai enlevé l'appel à console.log et changé pour alert). TestFunc est appelée à l'intérieur RealFunc.

Qu'est-ce qui se passe si vous supprimez "use strict";?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top