【问题标题】:Javascript attach an object syntactic sugar?Javascript附加对象语法糖?
【发布时间】:2012-05-22 14:50:09
【问题描述】:

我的班级中有一个像这样的对象:

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 语言中这是可能的(事实上,上面 sn-ps 中的语法几乎完全一样你会用 R 写什么来实现这一点)。

【问题讨论】:

    标签: javascript syntactic-sugar


    【解决方案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要短。

    【讨论】:

    • 啊哈,with 正是我所追求的。我理解使用它的注意事项(R 中的 with/attach 函数带有类似的警告/在 R 社区中以类似的担忧对待)。干杯! (目前我正在用你的第二种方法解决它)。
    【解决方案2】:

    您可以使用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
    });
    

    【讨论】:

      猜你喜欢
      • 2016-03-22
      • 2010-09-15
      • 2015-11-21
      • 1970-01-01
      • 2018-07-25
      • 2019-06-06
      • 1970-01-01
      • 2010-10-19
      • 2011-04-25
      相关资源
      最近更新 更多