Frage

Ich erhalte einen „TestFunc ist nicht definiert“ Fehler, wenn dieses Stück 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 ();
}

... wird von diesem Stück Code ausführen:

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

Lösung

// 1.
this.TestFunc ();

Das ist in Ordnung. Das wird funktionieren, mit den anderen Anrufen entfernt.

(Na ja, es funktioniert, solange Sie die RealFunc von seinem Besitzer nicht abblättern und nennen es auf seinem eigenen, wie var method= myObj.RealFunc; method(); oder über einen Event-Handler oder Timeout. In diesem Fall this in RealFunc nicht das wäre, MyObject Instanz und Sie würden an Schließungen oder Function.bind suchen müssen, um es zu arbeiten.)

// 2.
TestFunc ();

Nein, ist TestFunc nicht als Variable in lokalen oder globalen Umfang definiert. Dies bewirkt, dass der Fehler, den Sie von Firebug erhalten.

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

Nein, du hast Recht. :-) Es MyObject.prototype.TestFunc.call(this) würde, ausdrücklich getan.

JavaScript ist Art der Sache verwechseln von einigen der gleichen Methoden auf den Standard-Konstruktor Funktionen für integrierte Objekte als auf ihre Prototypen setzen (zum Beispiel String.split liegt vor, wenn wirklich nur String.prototype.split sollte). Aber das ist nicht auf Ihre eigenen Objekte passiert, wenn Sie ausdrücklich etwas wie MyObject.TextFunc= MyObject.prototype.TextFunc sagen.

Andere Tipps

Variante 1 scheint richtig. Ich habe versucht, den Code in ExecuteJS und ausgelassen 2. und 3., es funktionierte (obwohl ich den Anruf entfernt console.log und verändern es alert). TestFunc heißt innerhalb RealFunc.

Was passiert, wenn Sie "use strict"; entfernen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top