Использование шаблона раскрывающего модуля, как я могу предоставить прямой доступ к нестационарным переменным? Вот что у меня есть: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 нетронутым). Кроме того, что такого особенного в массивах, что объекты не имеют, что вызывает такое поведение?
Действительно благодарен за любые идеи,
В 'change' вы переустанавливаете значение переменной' obj', но изменяете переменную 'arr' на месте. 'M.A' и' M.O' являются ссылками на значения, которые 'arr' и' obj' удерживались в этой точке. Изменение значения переменных 'obj' и' arr' не влияет на 'M'. Нет никакого копирования. Возможно, вы хотели сделать «obj.key =», если я вижу это ... »;'. Если вы хотите сбросить все «obj» и только иметь одну пару ключ/значение в нем, вы можете пропустить его и «удалить» свойства, а затем использовать «.key =», если я вижу это ... »' – Ian
Ah , Я вижу, и смена O.key сделала трюк. В моем исходном коде у меня был «O = d3.layout.force()», который является довольно сложным объектом ... = / –