1

私は次のようなパターンで作業しています(疑似例):

var FOO = (function(foo) {

    var foo = foo || {},
    setThis = 'someValue';

    //--------------------------------------------------------------------------
    //
    // Public methods:
    //
    //--------------------------------------------------------------------------

    foo.init = function(bar) {

        this.blah = [];

        // Constructor stuff here...

    };

    foo.doSomething = function(bar) {

        if (bar) {

            this.doSomethingElse();

            // Stuff here...

        }

    };

    foo.doSomethingElse = function() {

        // Stuff here...

    };

    //--------------------------------------------------------------------------
    //
    // Private methods:
    //
    //--------------------------------------------------------------------------

    foo._imPrivate = function() {

        // ... stuff here ...

        this.blah = xyz; // References this.

    };

    foo._morePrivate = function(el) {

        // No reference to this.

    };

    foo._otherPrivate = function(el) {

        // No reference to this.

    };

    return foo; // Expose the methods.

}(FOO || {}));

次のようにインスタンス化されます。

window.onload = function() { FOO.init(stuff); }

3 つの質問:

  1. 「プライベート」メソッドが を参照しない場合、thisそれらを「標準」関数 (つまりfunction _imPrivate() { ... }、たとえば) にする必要がありますか? 質問する理由:を参照するメソッドがいくつかありますがthis、パブリック アクセスを許可したくありません。参照しない「ユーティリティ」メソッドもいくつかありますthis...参照するメソッドthisは、(モジュールパターンのコンテキストで) 標準関数にすることができますか?
  2. 誰かがsetThis変数のセッターを実装する方法の例を提供できますか?
  3. 上記のコードに改善の余地はありますか?
4

2 に答える 2

3

「プライベート」メソッドはプライベートではなく、パブリックです。OPは、すぐに呼び出される関数式(IIFE)の使用から利用可能なクロージャーを利用していないようです。

関数の値は、関数のthis呼び出し方法によって設定され、静的ではありません (ES5 バインドを使用しない限り)。「コンテキスト」とは何の関係もありません(少なくとも、ECMA-262でコンテキストが使用されている方法ではありません。これは、javascriptのコンテキストで単語を使用する方法です)。

Douglas Crockford のJavaScript のプライベート メンバーが役に立ちます。

あなたがやろうとしていることの実際の例を投稿すると、その実装でモジュール パターンを利用する方法について、より多くの助けが得られるでしょう。

于 2012-07-23T22:50:46.627 に答える
2

1.

できるよ_imPrivate.call(this, arg1, arg2,...);

この場合this_imPrivate関数は特定のインスタンスを参照します。

2.

var setThis = 'someValue';

foo.setter = function(value) {
    setThis = value;
};
于 2012-07-23T22:27:09.457 に答える