1

我的课堂上有一个对象,如下所示:

this.options = {
     a: 1,
     b: 2,
     ...
};

我只是想知道是否有一种方法可以将选项对象“附加”到 Javascript 中的当前范围,这样我就可以直接引用aand b(而不是this.options.aand this.options.b)。就像是:

attach(this.options);
var myVariable = a + 3; // 4
detach(this.options);

或者

with( this.options, {
   // code here
 var myVariable = a + 3; // 4
});

在上面,attachandwith具有获取所有子级this.options并将它们附加到当前范围的效果,因此它们可以通过a而不是this.options.a. (一旦完成,该with版本就会简单地分离this.options,将可能损坏的附件包含在该范围内)。

只要它在 Spidermonkey/Mozilla 引擎中工作,我不介意它是否不可移植。

我只是出于好奇和懒惰才提到这一点:所有嵌套的名称都变得烦人,而且我知道在 R 语言中这是可能的(事实上,上面片段中的语法几乎就是你要写的在R中实现这一点)。

4

2 回答 2

1

JavaScript 有一个与您描述的类似的with语句:

with (this.options) {
    var myVariable = a + 3;  // here a is actually this.options.a
}

但是,正如您在我链接到的 MDN 文章中看到的那样,使用它有一些缺点,例如,潜在的歧义。在上面的示例中,a可能是 的属性this.options,也可能是在别处定义的变量,仅查看该块无法判断。

with不推荐(严格模式下禁止)。

但是有一个安全的替代方法:创建一个引用的变量(再次在您的示例中)this.options

var o = this.options;

var myVariable = o.a + 3;

它不像a自己打字那么短,但比this.options到处重复要短。

于 2012-05-15T06:07:18.063 回答
0

您可以将对象包装在另一个对象中,使用attachdetach方法以及内部缓存来存储实际数据对象。然后让attachanddetach方法在回调中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
});
于 2012-05-15T06:01:30.420 回答