Javascript附加一个对象语法糖

Javascript attach an object syntactic sugar?

本文关键字:语法 一个对象 Javascript      更新时间:2023-09-26

我的类中有一个对象,如下所示:

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

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

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

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

在上面,attachwith具有获取this.options的所有子项并将它们附加到当前范围的效果,以便可以通过a而不是this.options.a访问它们。(with版本只是在完成后分离this.options,将可能具有破坏性的附加包含在该范围内)。

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

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

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要短。

您可以使用attachdetach方法以及用于存储实际数据对象的内部缓存将对象包装在另一个对象中。 然后让 attachdetach 方法在回调中提供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
});