Javascriptを:プロトタイプのメソッドエラー?
-
18-09-2019 - |
質問
私は「TestFuncが定義されていません」というエラーを取得していたときにこのコードのビット...
/* 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 ();
}
...このコードのビットから実行されます:
/* index.js */
var myObj = new MyObject ('test');
myObj.RealFunc (); // Firebug: "TestFunc is not defined"
解決
// 1.
this.TestFunc ();
それは大丈夫です。それは削除他の呼び出しで、動作します。
(まあ、それは限り、あなたはその所有者からRealFunc
を剥がすとvar method= myObj.RealFunc; method();
のように、イベントハンドラまたはタイムアウトを経由して、自分自身でそれを呼び出すことはありませんように動作します。その場合はRealFuncでthis
はないだろうMyObjectにインスタンスとあなたはそれを動作させるために閉鎖またはFunction.bind
を見る必要があると思います。)
// 2.
TestFunc ();
いいえ、TestFuncは、ローカルまたはグローバルスコープ内変数として定義されていません。これは、あなたがFirebugのから取得エラーになります。
// 3. (I didn't really think this would work,
// but thought it was worth a try...)
MyObject.TestFunc ();
いいえ、あなたは正しかったです。それは、MyObject.prototype.TestFunc.call(this)
明示的に行われることでしょう:-)ます。
JavaScriptは一種のための標準的なコンストラクタ関数に同じメソッドのいくつかを置くことによって、問題を混同しない内蔵の彼らのプロトタイプ上などのオブジェクト(例えばString.split
はどこ本当に唯一String.prototype.split
がすべき存在します)。あなたが明示的にMyObject.TextFunc= MyObject.prototype.TextFunc
のようなものを言うしない限り、しかし、それはあなた自身のオブジェクトに発生しません。
他のヒント
バリアント1が正しいようです。 (私はconsole.log
の呼び出しを削除し、alert
にそれを変更するが)私はExecuteJSで、あなたのコードを試してみましたが、2と3をスキップし、それが働きました。 TestFunc
がRealFunc
内で呼び出されます。
"use strict";
を削除する場合ははどうなりますか?