2012-05-15 1 views
1

У меня есть объект в моем классе, как так:Javascript придает объект синтаксическому сахару?

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 и прикрепление их к текущей области, чтобы они доступны через 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

Aha, 'с' есть * точно * какой был после. Я понимаю оговорки, которые приходят с его использованием (функции 'with' /' attach' в R приходят с аналогичными предупреждениями/рассматриваются с подобным опасением в сообществе R). ура! (на данный момент я решал его с помощью второго метода). –

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 
});