2013-03-22 6 views
1

Можно ли сделать что-то вроде этого:Можно ли отложить значение свойства, но использовать его раньше?

var oHelper = { 
    ref: null, 
    data: {"key":"value"} 
} 
var oSettingsThing = { 
    data: oHelper.ref, 
    //.... 
} 

//....some lines before or in other file loaded after 
$(document).ready(function() { 
    oHelper.ref = doDataStuff(oHelper.data); 
    var thing = Framework.crate('module.thing', oSettingsThing); 
} 

Моя цель состоит в том, чтобы держать $(document).ready(function(){ как можно более чистым, и если это возможно, чтобы отделить оба блока в отдельных файлов.

Я подумал, что, как и в переменном копировании в задании свойств значений копия по ссылке поможет мне, но я был неправ, и на Framework.crate('module.thing', oSettingsThing); значение oHelper.ref еще null.

Что я не понимаю?

Я использую ExtJS и структура объектов это довольно сложнее:

var oHelper = { 
    ref: null, 
    data: {"key":"value"} 
} 
//.... 
var oSettingsThing = { 
GENERALS:{ 
    //.. 
    items: [ 
     { 
      items: [ 
       { 
        //.... 
        store: oHelper.ref, 
       } 
//.... 
Ext.onReady(function() { 

    mc_documentos.stores.STATUS.ref = new Ext.data.SimpleStore(mc_documentos.stores.STATUS.data); 
    //I was hopping to at this point have oSettingsThing.GENERALS...data !== null 
    var generalsFilters= Ext.create('Ext.form.Panel', oSettingsThing.GENERALS); 
+1

Примитивные значения копируются. 'null' - это примитивное значение. Но даже если у вас будет пустой объект в начале, 'data' получит ссылку на этот объект, а не на свойство' oHelper.ref'. –

+0

_Примитивные значения копируются. Это то, чего я не знал, спасибо. – buguibu

ответ

1

Об исполнении oSettingsThing.data будет указывать на null. Он не будет связан с oHelper.ref.

Теперь, если вы сделаете это:

var oHelper = { 
    ref: null 
}; 
var oSettingsThing = { 
    data: oHelper, // point to oHelper instead of oHelpder.ref 
}; 

console.log(oSettingsThing.data.ref); // null 
oHelper.ref = "somedata"; 
console.log(oSettingsThing.data.ref); // "somedata" 
+0

Как я сказал @Adder, я омрачаю фреймворк, который я использую, потому что не имеет значения, но я не могу делать «данные: oHelper', объекты довольно сложны. Мне нужно сделать 'oHelper.ref = doDataStuff (oHelper.data);' но, может быть, 'data' и' ref' могут находиться в разных объектах. – buguibu

0

null является своего рода ссылкой, и когда он назначается oSettingsThing.datanull в настоящее время назначен.

Вы могли бы сделать

var thing = Framework.create('module.thing', oHelper.ref); 
+0

Я опускаю рамки, которые я использую, но я не могу этого сделать. – buguibu

0

Это потому, что когда вы присваиваете что-то oHelper.ref, предыдущее значение отделяется от символа (не разрушен, потому что oSettingsThing.data все еще указывает на него).

Рассмотрим сделать oHelper.ref уже сам по себе объект:

var oHelper = { 
    ref: { value: null } 
} 

var oSettingsThing = { 
    data: oHelper.ref 
} 

// later 
oHelper.ref.value = something_else; 

oSettingsThing.data.value // something_else 

Если вы не можете изменить структуру oSettingsThing:

oSettingsThing.data = oHelper.ref = doDataStuff(oHelper.data); 
+0

I'cant изменить структуру 'oSettingsThing', поэтому я не могу сделать' oSettingsThing.data.value'. – buguibu

+0

@buguibu Затем, 'oSettingsThing.data = oHelper.ref = doDataStuff (oHelper.data);' возможно? :) –

+0

Это работает, но это не то, что я ищу, потому что strcuture намного сложнее, чем у меня есть сообщение. Что вы сказали, что оно переведено в моем коде на эту уродливую строку 'mc_documentos.filters.GENERALS.items [0] .items [0] .store = mc_documentos.stores.COMMUNITY.ref = new Ext.data.SimpleStore (mc_documentos.stores. COMMUNITY.data); 'и я хочу этого избежать. – buguibu

Смежные вопросы