javascript – 坚持一个简单的对象文字范围/引用问题

这是我的结构示例:

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

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

    fn : {

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

    } 

};

现在,正如您所看到的,我将输入,按钮,面板和函数存储在各自的对象文字中.问题在于fn.abc,fn.def或page.fn中的任何其他函数.我希望能够从fn内部的函数中访问我的输入,按钮和面板.

显然,我知道我可以输入this.is.a.really.long.namespace.inputs,但正如你所看到的那样,这很长,而且我不想为我需要的每一个实例输入它引用页面中的对象.

有没有办法可以直接从fn中引用输入,按钮和面板?

我以为我能做到:

fn : {

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

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

}

这将允许我在fn.abc中使用that.inputs,但该方法是否存在问题?我需要注意哪种开销?或者有更好的方法来实现这一目标吗?

最佳答案 这没什么不对.事实上,由于以下原因,您可能会减少开销:

>减少对象heirarchies的运行时分辨率
>更少的字符=更短的脚本

更加丰富的构造是常用的“模块模式”.

Javascript在内部效率相当低(例如,它没有真正的索引数组),所以你可以做的任何事情来减少运行时查找通常是好的.创建指向long heirarchy的指针将比每次使用完整的heirarchy快得多.这可能只会在长循环中产生很大影响,但由于它也更容易阅读,所以它只是更快一点的好处 – 没有任何缺点.

(编辑)

用直接对象做这个,你可以做这样的事情,使用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;
}());
点赞