0

Использование шаблона раскрывающего модуля, как я могу предоставить прямой доступ к нестационарным переменным? Вот что у меня есть:JS: раскрытие шаблона модуля - доступ к внутренним объектам против массивов?

var M = function() { 
    var obj = {}; 
    var arr = []; 
    var change = function() { 
     obj = {"key":"if I see this, O is a reference to obj"}; 
     arr.push("If I see this, A is a reference to arr") 
     }; 
    return { 
     change: change, 
     O: obj, 
     A: arr 
     }; 
}(); 

M.change(); 
console.log(M.A); // prints ["If I see this, A is a reference to arr"] 
console.log(M.O); // prints Object {}, wanted "if I see this, O..." 

Кажется, что ссылки обр непосредственно, в то время как O оседает копию значения OBJ в момент времени инициализации. Я бы понял поведение, если obj были строкой, float или boolean.

Я мог бы, конечно, разоблачить obj через общедоступный метод get_obj, но мне все же интересно, если это можно решить без дополнительных методов помощи (я хочу сохранить интерфейс для obj нетронутым). Кроме того, что такого особенного в массивах, что объекты не имеют, что вызывает такое поведение?

Действительно благодарен за любые идеи,

+0

В 'change' вы переустанавливаете значение переменной' obj', но изменяете переменную 'arr' на месте. 'M.A' и' M.O' являются ссылками на значения, которые 'arr' и' obj' удерживались в этой точке. Изменение значения переменных 'obj' и' arr' не влияет на 'M'. Нет никакого копирования. Возможно, вы хотели сделать «obj.key =», если я вижу это ... »;'. Если вы хотите сбросить все «obj» и только иметь одну пару ключ/значение в нем, вы можете пропустить его и «удалить» свойства, а затем использовать «.key =», если я вижу это ... »' – Ian

+0

Ah , Я вижу, и смена O.key сделала трюк. В моем исходном коде у меня был «O = d3.layout.force()», который является довольно сложным объектом ... = / –

ответ

1
obj["key"] = "if I see this, O is a reference to obj"; 

Вы можете установить key свойство для obj и сохранить ссылку на исходный объект.