2

私の目標:グローバルな名前空間をクリーンに保つために、JavaScript に名前を付けます。

私の質問: JavaScript 名前空間のメソッド間で変数を共有するにはどうすればよいですか?

私の例では、ASP.net ModalPopupExtender の動作を拡張して上書きしています。グローバルにするかどうかに関係なく、modalPopupStack変数をModalPopupShowOverride共有する方法を知りたいです。ModalPopupHideOverride

関連コード:

$(function () {
    if (Sys.Extended != undefined && Sys.Extended.UI != undefined && Sys.Extended.UI.ModalPopupBehavior != undefined) {
        MyPageMethods.ModalPopupShowOriginal = Sys.Extended.UI.ModalPopupBehavior.prototype.show;
        MyPageMethods.ModalPopupHideOriginal = Sys.Extended.UI.ModalPopupBehavior.prototype.hide;
        Sys.Extended.UI.ModalPopupBehavior.prototype.show = MyPageMethods.ModalPopupOverrides.ModalPopupShowOverride;
        Sys.Extended.UI.ModalPopupBehavior.prototype.hide = MyPageMethods.ModalPopupOverrides.ModalPopupHideOverride;
    }
});

var MyPageMethods = {

    ModalPopupShowOriginal: function () { },

    ModalPopupHideOriginal: function () { },

    ModalPopupOverrides: {

        modalPopupStack: new Array(),

        ModalPopupShowOverride: function () {

            var extender = this;
            var topElement;

            MyPageMethods.ModalPopupShowOriginal.apply(this, arguments);

            for (var x = 0; x < modalPopupStack.length; x++) {

                if ($(modalPopupStack[x].background).css("z-index") > $(extender._element).css('z-index') || $(modalPopupStack[x].popup).css("z-index") > $(extender._element).css('z-index')) {

                    if ($(modalPopupStack[x].background).css("z-index") > $(extender._element).css('z-index')) {
                        topElement = $(modalPopupStack[x].background).css("z-index");
                    }
                    else if ($(modalPopupStack[x].popup).css("z-index") > $(extender._element).css('z-index')) {
                        topElement = $(modalPopupStack[x].popup).css("z-index");
                    }

                }

            }

            if (topElement != undefined) {
                $(extender._backgroundElement).css('z-index', topElement);
            }

            modalPopupStack.push({ 'id': extender._id, 'background': extender._backgroundElement, 'popup': extender._element });

        },

        ModalPopupHideOverride: function () {
            var extender;
            MyPageMethods.ModalPopupHideOriginal.apply(this, arguments);
            extender = modalPopupStack.shift();
        }

    }

}

これには簡単な解決策があると確信していますが、それが何であるかはわかりません。

4

3 に答える 3

4

変数を名前空間内で表示したいが、外部では表示したくないようです。その場合は、次の解決策を試してください。

var MyPageMethods = (function() { 
  // This variable is local to the namespace.  It can't be accessed from 
  // the caller
  var modalPopupStack = new Array();

  // These values are available to the callers as members of MyPageMethods
  return { 
    ModalPopupShowOriginal: function () { },

    ModalPopupHideOriginal: function () { },

    ModalPopupOverrides: { ... } 
  };
})();

このパターンでは、関数を使用して、名前空間のローカル変数のプライベート関数スコープを確立します。次に、名前空間外でアクセス可能なメンバーを含む新しいオブジェクトを返します。これらの定義は関数内で発生するため、名前空間のプライベート データにアクセスできます。

于 2012-07-06T19:10:31.630 に答える
1

以下を使用して、両方のメソッドでそのプロパティを参照できます。

MyPageMethods.ModalPopupOverrides.modalPopupStack

これは少し面倒なので、次のように各メソッド内でエイリアスを設定することをお勧めします。

var modalPopupStack = MyPageMethods.ModalPopupOverrides.modalPopupStack;

値はグローバルスコープで引き続き表示されますが(@JaredParの回答とは異なります)、既存のグローバルオブジェクトに便乗しているだけであることに注意してください。

于 2012-07-06T19:14:26.220 に答える
0

必要に応じて、名前空間の一部にします。または、プライバシーを強化するために、それを組み込んで必要な機能を公開するローカルクロージャーを作成します。

var MyPageMethods = {
    ModalPopupShowOriginal: function () { },
    ModalPopupHideOriginal: function () { },
    ModalPopupOverrides: (function() {
        var modalPopupStack = new Array();
        var show = function () {
            // show implementation using modalPopupStack
        };
        var hide = function () {
            // hide implementation using modalPopupStack
        };
        return {
            ModalPopupShowOverride: show,
            ModalPopupHideOverride: hide
        }
    }())
};

ちなみに、new Array()最近は使うのはかなり珍しいです。これは通常好まれます:

        var modalPopupStack = [];

より短く、よりクリーンで、より明確です。

于 2012-07-06T19:18:47.180 に答える