4

このコードを実行すると、「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"
4

2 に答える 2

3
// 1.
this.TestFunc ();

それはいいです。他の呼び出しを削除すると、それは機能します。

(ええと、所有者から を剥がして、イベント ハンドラーやタイムアウトなどを介してRealFunc独自に呼び出さない限り、機能します。その場合、RealFunc は MyObject インスタンスではなく、あなたはクロージャーを調べるか、それを機能させる必要があります。)var method= myObj.RealFunc; method();thisFunction.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

于 2010-02-05T14:55:57.480 に答える
1

バリアント 1 は正しいようです。私はあなたのコードを ExecuteJS で試し、2. と 3. をスキップしましたが、うまくいきました (ただし、への呼び出しを削除してconsole.logに変更しましたalert)。TestFunc内で呼び出されますRealFunc

を削除するとどうなります"use strict";か?

于 2010-02-05T14:56:21.733 に答える