4

これが私の構造のサンプルです:

this.is.a.really.long.namespace = {

    inputs : {},
    buttons : {},
    panels : {},

    fn : {

        abc : function() {},
        def : function() {}

    } 

};

ご覧のとおり、入力、ボタン、パネル、関数をそれぞれのオブジェクト リテラルに格納しています。問題はfn.abcfn.def、または 内の他の関数にありpage.fnます。内の関数内からmy inputsbuttons、およびにアクセスできるようにしたい。panelsfn

もちろん、入力できることはわかってthis.is.a.really.long.namespace.inputsいますが、ご覧のとおり、かなり長いので、ページ内のオブジェクトを参照する必要があるインスタンスごとに入力する必要はありません。

inputsbuttons、およびpanels内から直接参照できる方法はありませんfnか?

私はできると思っていました:

fn : {

    that : this.is.a.really.long.namespace,

    abc : function() {},
    def : function() {}

}

that.inputsの中で使用できるようになりますfn.abcが、その方法に懸念はありますか? 知っておく必要のあるオーバーヘッドはありますか? または、これを達成するためのより良い方法はありますか?

4

4 に答える 4

2

これには何の問題もありません。実際、次の理由でオーバーヘッドを削減する可能性があります。

  1. オブジェクト階層の実行時の解決が少ない
  2. 文字数が少ない=スクリプトが短い

より具体的な構成は、一般的に使用される「モジュールパターン」です。

Javascriptは内部的にはかなり非効率的であるため(たとえば、実際のインデックス付き配列がない場合)、実行時のルックアップを減らすためにできることはすべて通常は適切です。長い階層へのポインタを作成することは、毎回完全な階層を使用するよりもはるかに高速です。これはおそらく長いループでのみ重要になりますが、読みやすいので、少し速くなるというボーナスにすぎません。欠点はありません。

(編集)

ストレートオブジェクトでこれを行うには、jQueryを使用してプロパティの追加を簡素化して、次のようなことを行うことができます。

this.is.a.long.namespace = {};
$.extend(this.is.a.long.namespace, 
   { that: this.is.a.long.namespace,
   ... // other properties 
   });

一般的に言えば、機能オブジェクトを構築する場合は、モジュールパターンの方が優れています。これは、柔軟性が高く、スコープを使用してプライベート変数/オブジェクトを作成できるためです。

this.is.a.long.namespace = (function() 
{
    var that = {},
       somePrivateVariable;
    function privateFunction() {
      ...
    } 
    that.inputs = {};
    ...
    // assign everything to "that"
    return that;
}());
于 2011-06-29T19:44:58.160 に答える
0

わかりました...これが私がやったことです:

this.is.a.really.long.namespace = {

    inputs  : { firstName : undefined },
    buttons : { submit : undefined },

    fn : {

        root : undefined,

        abc : function() { console.log(this.root.inputs.firstName); },
        def : function() { console.log(this.root.buttons.submit); }

    },

    init : function() {

        var self     = this,
            fn       = self.fn,
            inputs   = self.inputs,
            buttons  = self.button;

            fn.root  = this;  // this is the key

            inputs.firstName  = $("#first-name");
            buttons.submit    = $("#submit-button");

        fn.abc();
        fn.def();

    }

};
于 2011-06-29T20:22:45.303 に答える
0

私は次のようなことを考えます:

var namespace = this.is.a.really.long.namespace
this.is.a.really.long.namespace = {

    root : namespace,
    inputs : {},
    buttons : {},
    panels : {},

    fn : {

        abc : function() {},
        def : function() {}

    } 
};

そこから、オブジェクト内のどこでも名前空間を参照しても問題はないはずです。

于 2011-06-29T19:42:35.747 に答える
0

parentすべてのレベルがその上のレベルを指すパラメーターを含むようにオブジェクトを構築すると、その方法でデータにアクセスできます。この同様の質問を見てください。

于 2011-06-29T19:40:39.620 に答える