4

这是我的结构示例:

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

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

    fn : {

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

    } 

};

现在,如您所见,我将输入、按钮、面板和函数存储在它们各自的对象字面量中。问题在于fn.abc,fn.defpage.fn. 我希望能够从inputs.buttonspanelsfn

显然,我知道我可以键入this.is.a.really.long.namespace.inputs,但正如您所见,这很长,我不想为需要在页面中引用对象的每个实例都键入它。

有没有办法可以直接引用inputs,buttonspanelsfrom inside fn

我在想我可以这样做:

fn : {

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

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

}

这将允许我使用that.inputsinside of 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

如果您以这样一种方式构建对象,即每个级别都包含一个parent指向其上方级别的参数,那么您可以通过这种方式访问​​数据。看看这个类似的问题

于 2011-06-29T19:40:39.620 回答
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

好的......这就是我最终做的事情:

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 回答