2012-05-15 79 views
1

我有一個對象在我的課像這樣:Javascript附加一個對象語法糖?

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來實現這一點)。

回答

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無處不在短。

+0

啊哈,'帶'是*完全*我以後。我瞭解它的使用注意事項(R中的'with'''' attach'函數帶有類似的警告/在R社區中被類似的理解所對待)。乾杯! (目前我正在用你的第二種方法解決它)。 –

0

您可以將對象包裝在另一個對象中,使用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 
});