[JS - Module Case] Функция не отчита промени в пропъртита


1

На този линк съм описал ситуацията. Коментарите са нещата които конзолата ми показва за всяка команда.

http://pastebin.com/jCgEBFj4

Въпросът? Какво става тук?

Когато кажа:
return { key : nameOfDefinedVariable }
очаквам че достъпвайки key ще стигам до дефинираната променлива.
Тук обаче изглежда сякаш променливата се копира - тоест аз променям копието на "changed", а не самата променлива в модула, която логвам.

Как да направя така че key да ме отвежда до същинската променлива, а не просто да я копира?
(Решението трябва да може да работи независимо от това каква е стойността на променливата в модула. Да е еднакво, независимо дали става дума за функция, обект или базов тип).






Отговори



0

Пробва ли да промениш function logEm() така :

 
console.log(a.first + "\n" + a.second + "\n" + a.third  + "\n" + a.fourth + "\n" + "Finaly!");
};
 
При мен поне така си изкарва :
 
changed
b
undefined
undefined
Finaly!

 


от penjurov (1466 точки)


0
Това е тъпо. Ще работи, но само за този пример. На всеки друг ще се чупи.
------ В смисъл? Откъде функция в модул знае как ще се казва променливата на която ще присвоиш резултата от този модул? ------
Освен това защо мислиш че ще имам възможност да променям функцията - тя е някаква функция, идваща от някъде. Изобщо няма да знам какво има в нея.
Това което искам е някакъв JavaScript аналог на "*<име-на-променлива>" от езикът C - тоест нещо което да ме препраща към друго нещо.
// Добавка Всъщност това което предлагаш би трябвало да се чупи дори на тоя пример. Върнатия обект няма third и fourth. Те са само в модула.

от lokiko91 (790 точки)

0
Нещо не разбрах какво точно искаш. Нали самото IIFE ти създава нов обект а? Искаш да излизат a,b,c,d или променените неща? Ако искаш променените трябва да се обръщаш с името на обекта.пропъртито. var first и а.first са две различни променливи. Когато вадиш logEm() кое викаш , first или а.first? И защо променяйки a.first решаваш, че и first ще се промени?
Всъщност това което предлагам не се чупи, а си връща каквото трябва :
changed b undefined undefined Finaly!

от penjurov (1466 точки)



2
Ако изнесеш сетър в ретърна, мисля че ще стане това което искаш. Например:
return{
setFirst : function(value){first = value;}
}
И съответно променяш стойността през сетъра.

от d.brezoev (212 точки)


0
да - сетих се за това в разговора по другия коментар. Но искам да може и да се взима, което значи че става
function(value){ if(value !== undefined) { first = value; } else { return first } }
Уловката е че това нещо е голямо и сложно. В смисъл - за всяко пропърти което МИ добавя юзъра (ще има тази възможност) аз трябва да му eval-вам един такъв гетер/сетер.
Иска ми се вместо това да измисля начин да соча към основното нещо
( ...или да превърна въпросното нещо в референтен тип... това може би ще стане. Не знам...)

от lokiko91 (790 точки)

0
Малко се обърках, пробва ли да върнеш обект. var result = { setFirst : function(){}, setSecond: function(){}, ..., }
return result; Edit: To така е същото всъщност.

от d.brezoev (212 точки)