Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Свойство объекта в качестве ссылки на переменную, возможно ли? (https://javascript.ru/forum/misc/46574-svojjstvo-obekta-v-kachestve-ssylki-na-peremennuyu-vozmozhno-li.html)

Pedro Garciya Lopez 15.04.2014 17:20

Свойство объекта в качестве ссылки на переменную, возможно ли?
 
Есть некий прототип объекта, и есть несколько объектов которые наследуют этот прототип. Так же есть глобальная переменная, которую каждый из этих объектов может изменять одним из своих методов. Точнее таких переменных может быть несколько, поэтому я хотел при инициализации конкретного объекта указывать с какой именно переменной он работает. Можно ли как-то это реализовать? Так как я думал, не получается:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<script>
	//Объект
	function obj(init)
    {
        this.data = init.data;
    }

    obj.prototype.f1 = function(d) 
    {
		this.data = d;
    }

	var var1='первоначальное значение',
	
		o1 = new obj({ data: var1 }), // инициализируем объект o1

		// я наивно полагал что таким образом свойство data этого
		// объекта будет ссылаться на переменную var1
		// и в методе она будет доступна через this.data
	
		o2 = new obj({ data: var1 }); // инициализируем объект o2

	o1.f1('первый'); //вызываем метод объекта o1 который по моим предположениям должен был изменить значение var1 

	alert(var1); // увы var1 по прежнему равен своему первоначальному значению
	
	o2.f1('второй');
	alert(var1);
</script>
<body>
</body>
</html>

jsnb 15.04.2014 17:31

Все глобальные переменные - это свойства объекта window. Что мешает из методов обращаться к ним как window['varName']? А в качестве параметра можно передавать имя нужной глобальной переменно строкой.
Примерно так:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<script>

    function obj(init)
    {
        this.data = init.data;
    }
 
    obj.prototype.f1 = function(d) 
    {
        window[this.data] = d;
    }
 
    var var1='первоначальное значение',
     
        o1 = new obj({ data: 'var1' }),
 
     
        o2 = new obj({ data: 'var1' });
    o1.f1('первый');
 
    alert(var1); 
     
    o2.f1('второй');
    alert(var1);
</script>
<body>
</body>
</html>

Octane 15.04.2014 17:34

http://dmitrysoshnikov.com/ecmascrip...tion-strategy/

Makarov 15.04.2014 17:43

А в общем случае (не глобальная переменная) можно запилить в объекте свойство скажем scope, передавать в это свойство прям контекст и внутри уже с ним работать

Pedro Garciya Lopez 15.04.2014 19:41

Octane, спасибо за статью! Помогло ... таки by sharing


Часовой пояс GMT +3, время: 09:17.