Javascript: Prototyp Methode Fehler entdeckt?
-
18-09-2019 - |
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"
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?