陷入了一个简单的对象文字范围/引用问题
Stuck on a simple object literal scope / referencing issue
下面是我的结构示例:
this.is.a.really.long.namespace = {
inputs : {},
buttons : {},
panels : {},
fn : {
abc : function() {},
def : function() {}
}
};
现在,正如您所看到的,我将输入、按钮、面板和函数存储在它们各自的对象文字中。问题存在于fn.abc
、fn.def
或page.fn
内部的任何其他函数中。我希望能够从fn
内部的函数中访问我的inputs
、buttons
和panels
。
很明显,我知道我可以键入this.is.a.really.long.namespace.inputs
,但正如你所看到的,这很长,我不想为每个需要引用页面中对象的实例都键入它。
难道我没有办法从fn
中直接引用inputs
、buttons
和panels
吗?
我在想我可以做:
fn : {
that : this.is.a.really.long.namespace,
abc : function() {},
def : function() {}
}
这将允许我在fn.abc
中使用that.inputs
,但这种方法有问题吗?有什么开销需要我注意吗?或者有更好的方法来实现这一点吗?
这没有错。事实上,由于以下原因,您可能会减少开销:
- 对象层次结构的运行时分辨率较低
- 更少的字符=更短的脚本
一个更加充实的结构是常用的"模块模式"
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;
}());
如果您以这样一种方式构建对象,即每个级别都包含一个指向其上级别的parent
参数,那么您可以通过这种方式访问数据。看看这个类似的问题。
好的。。。以下是我最终所做的:
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();
}
};
我会考虑这样的东西:
var namespace = this.is.a.really.long.namespace
this.is.a.really.long.namespace = {
root : namespace,
inputs : {},
buttons : {},
panels : {},
fn : {
abc : function() {},
def : function() {}
}
};
从那里开始,在对象中的任何位置引用命名空间都应该没有问题。
- 是否可以将字符串转换为文字对象数组
- jQuery:如何使用文字对象方法中的方法来获取全局变量
- 如何检查文字对象是否在 Javascript 数组中
- Javascript解析序列化的Groovy映射到JS文字对象
- asp.net 文字对象传递给 JavaScript
- 文字对象和jquery选择器DRY
- 将文字/对象/类传递给具有数千次调用的函数的内存含义
- Javascript 文字对象和单例模式
- 如何在 PHP 中将 JavaScript 文字对象转换为 Json 对象
- 将文字对象转换为对象'的属性
- 文字对象中的元素
- 将开关大小写(在c++中)替换为javascript中的文字对象
- 使用函数式编程过滤文字对象
- 关于文字对象,也许还有自动执行函数
- 如何访问“参数”来自闭包的外部函数的文字对象
- 关于文字对象语法的限制
- 在文字对象中创建属性
- JavaScript异步调用文字对象函数
- 文字对象和函数构造函数
- 奇怪的行为和使用Object的多个实例.在文字对象上创建