2

JavaScriptモジュールパターンの最適な使用方法を理解しようとしています。私の問題は、がオブジェクトthisに設定されているため、モジュール自体からモジュールを参照する方法がないように見えることです。Window

私はこの簡単なテストコードを持っています:

var Test = function() {
    var that = this;

    return {
        something: function() {
            console.info(that);
        }
    }
}

var test1 = Test();
test1.something();

var test2 = Test();
test2.something();

両方とも、モジュール自体ではなくオブジェクトへの参照を出力しtest1ます。test2Window

thisモジュール内で有効になるように変更する方法はありますか?

4

3 に答える 3

3

あなたがした場合

var test1 = new Test()

その後、あなたはすることができます

test1.something(); 

別のモジュール構造は、次のようなことを行うことです。

var myModule = function () {
    var obj = {};
    obj.something = function () { 
         return console.log(obj);
    };
    obj.something2 = function () {
         return console.log(obj === this); // true
    };
    return obj;
};
var test = myModule();
test.something();
test.something2();

お役に立てれば

于 2013-01-08T10:05:41.977 に答える
1

JavaScriptモジュールパターンとJavaScriptコンストラクター関数を混同していると思います。

JavaScriptコンストラクター関数

関数を記述し、そのnew前にキーワードを付けて呼び出すと、その関数はコンストラクター関数として呼び出されます。

thisキーワードを使用してコンストラクター関数内で参照できる新しいオブジェクトが自動的に返されます。

var Test = function() {
    var that = this;

    this.something = function () {
        console.info(that);
        console.info(this);
    };
}

var test1 = new Test();
test1.something();

代わりに独自のオブジェクトを返すことができますが、通常はコンストラクターでそれを行うことはなく、this代わりに次のように使用します。

var Test = function() {
    var that = this;

    return {
        something: function () {
            console.info(that);
            console.info(this);
        }
    };
}

var test1 = new Test();
test1.something();

その前にキーワードを付けて呼び出さない場合newは、通常の関数のように呼び出されます。つまり、thisその内部への参照は、関数がプロパティであるオブジェクトを参照します(他に何も存在しない場合)。 、はグローバルオブジェクトになります。これはWebブラウザではwindow)です。

var geoff = {
    Test: function () {
        var that = this;

        return {
            something: function () {
                console.info(that);
            }
        };
    }
};

var test2 = geoff.Test();
var test3 = Test();

注:コンストラクター関数では、通常、プロトタイプオブジェクトでメソッドを定義するため、コンストラクター関数を使用して作成するオブジェクトごとにメソッドが不必要に再定義されることはありません。

var Test = function() {
    this.else = "Something Else"
}
Test.prototype.something = function () {
    console.info(this);       
}
Test.prototype.somethingElse = function () {
    console.info(this.else);       
}

var test4 = new Test();
test1.somethingElse() // Logs "Something Else"

(前述のようにコンストラクター関数から独自のオブジェクトを返すと、プロトタイプオブジェクトのメソッドにアクセスできなくなることに注意してください。)

また、コンストラクター関数を呼び出すたびに、新しいオブジェクトが返されることにも注意してください。(他の関数と同じように)コンストラクター関数にパラメーターを渡し、それらを使用して、返されるオブジェクトをカスタマイズできます。

var Test = function(else) {
    this.else = else;
}
Test.prototype.somethingElse = function () {
    console.info(this.else);       
}

var test1 = new Test("Something else");
var test2 = new Test("Something else again");

test1.somethingElse(); // Logs "Something else"
test2.somethingElse(); // Logs "Something else again"
于 2013-01-08T10:39:25.140 に答える
0

あなたが抱えている問題はthis、オブジェクトを参照しているが、オブジェクトでTest()はないためです。それは単なる機能です。所有Test()するオブジェクトはWindowオブジェクトです(Testはグローバルスコープにあるため)。したがって、this内から参照すると、それが返されますTest()

次のようなものを試してみてください。

var testObj = {
    Test : function() {
        var that = this;
            return {
            something: function() {
                console.info(that);
            }
        }
    }
}

これで、呼び出すことができ、オブジェクトtestObj.Test();への参照を取得できます。testObj

それが物事を少し明確にすることを願っています。

于 2013-01-08T10:12:40.687 に答える