Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ссылки/указатели в JS (https://javascript.ru/forum/misc/11148-ssylki-ukazateli-v-js.html)

poorking 22.02.2011 20:12

Здравствуйте, чтобы не сорить новыми темами, решил написать тут, вопрос похожий

к примеру есть простенький конструктор
function constr(){
	var a = 0
	
	this.inca = function(){
		a++
	}
	
	this.geta = function(){
		return a
	}
}


создаем новый объект
var o = new construct()

и нужно получить копию этого объекта, а точнее ссылку на копию, а не на оригинал, чтобы применить один из методов в копии, изменяющих локальную переменную, есть ли такая возможность?
o.inca()

alert(o.geta())

var temp = o // так получим ссылку

temp.inca()

alert(o.geta()) //значение изменилось, но по задумке не надо бы ((


копирование всех свойств и методов в цикле не помогает, локальные переменные не копируются

B@rmaley.e><e 22.02.2011 21:02

Ну вызовите конструктор еще раз, в чем проблема?

Kolyaj 22.02.2011 21:13

Цитата:

Сообщение от poorking
есть ли такая возможность?

Нет.

А зачем?

poorking 22.02.2011 21:50

B@rmaley.e><e,
с новым вызовом конструктора не получится, потому как в конкретном случае конструктор генерирует некоторые локальные перемненные рандомно.
Kolyaj,
например:
function constr(){
	var r = Math.round(Math.random()*3)
	var a = 0;
	
	this.geta = function(){
		return a
	}
	
	this.calc = function(){
		switch(r){
			case 0:
				a = 0;
			case 1:
				a += 11
			break;
			case 2:
				a += 22
			break;
			case 3:
				a += 33
			break;
		}
	}
}

var o = new construct() //в экземпляре, на который получили ссылку есть локальная переменная, генерируемая рандомно (r)


нужно проверить, например, стоит ли выполнять calc().

если geta() возвращает после метода calc() больше, ну скажем 100, то не выполнять, иначе, выполнить

я хотел создать ссылку на копию объекта, выполнить calc(), проверить, и потом в зависимости от результата выполнять или не выполнять calc() по ссылке на оригинал

Kolyaj 22.02.2011 22:52

Такой конструктор вы сами написали? Отличный пример против приватизации переменных в JS.

poorking 22.02.2011 23:15

Ну приватизировать вроде получается, если я правильно понял
function constr(){
	var a = 0
	
	this.inca = function(){
		a++
	}
	
	this.geta = function(){
		return a
	}
}

var o1 = new constr()
	


var o2 = new constr()

o1.inca()
o1.inca()
o1.inca()


o2.inca()

alert(o1.geta()+"  "+o2.geta()) //у каждого своя приватная a

но вот значение в переменной хранить нельзя, придется тогда рандомную r, генерируемую в конструкторе, хранить как свойство и проверять
if(!(o.geta() + o.r>100)) 
   o.calc()

Kolyaj 22.02.2011 23:25

Цитата:

Сообщение от poorking
Ну приватизировать вроде получается, если я правильно понял

Конечно получается. Только это создаёт много не заметных с первого взгляда проблем. Ваша одна из таких.

poorking 23.02.2011 00:35

Понятно, тогда постараюсь избегать подобных ситуаций. Спасибо!


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