这是我的结构示例:
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;
}());