我班上有一个对象:
this.options = {
a: 1,
b: 2,
...
};
我只是想知道是否有办法将选项对象“附加”到Javascript中的当前范围,这样我就可以直接引用a
和b
(而不是this.options.a
和this.options.b
)。类似的东西:
attach(this.options);
var myVariable = a + 3; // 4
detach(this.options);
或
with( this.options, {
// code here
var myVariable = a + 3; // 4
});
在上文中,attach
和with
具有将this.options
的所有子女带到当前范围并将其附加到当前范围的效果,以便可以通过{{1}访问它们而不是a
。 (this.options.a
版本一旦完成就会分离with
,将可能具有破坏性的附加内容包含在该范围内。
只要它适用于Spidermonkey / Mozilla引擎,我不介意它是否不便携。
我只是因为好奇心而提到这一点。懒惰:所有嵌套的名字都变得很烦人,我知道在R语言中这是可能的(事实上,上面的片段中的语法几乎就是你在R中写的来实现这一点)。 / p>
答案 0 :(得分:1)
JavaScript的with
statement与您描述的内容类似:
with (this.options) {
var myVariable = a + 3; // here a is actually this.options.a
}
然而,正如你在MDN上看到的那篇文章所指出的,使用它有一些缺点,因为,例如,潜在的歧义。在上面的示例中,a
可以是this.options
的属性,也可以是其他地方定义的变量,只看那个块就无法分辨。
with
(并且strict mode中禁止使用)。
有一个安全的替代方案:创建一个引用的变量(在你的例子中再次)this.options
:
var o = this.options;
var myVariable = o.a + 3;
它不像单独输入a
那么短,但它比在任何地方重复this.options
要短。
答案 1 :(得分:0)
您可以使用attach
和detach
方法以及用于存储实际数据对象的内部缓存将对象包装在另一个对象中。然后让attach
和detach
方法在回调中提供data
作为this
:
function TheObject(data){
var that = this;
this.data = data;
this.attach = function(callback){
callback.apply(that.data);
}
}
//wrap the object
var myobj = new TheObject({
a: 1,
b: 2
});
myobj.attach(function(){
//"this" in here is the "data" in the object.
//this.a
//this.b
});