| Автор
| Сообщение |
 Kate
Постоянный участник

Возраст: 27
Знак зодиака: 
Зарегистрирован: 04.06.2007
Сообщения: 149
|
|
|
Цитата |
|
что-то не могу справиться вроде как с тривиальной задачкой. Дело в том, что логика ООП в JS несколько различна от онной в стандартных ООП-языках.
вот возмем к примеру как всегда элементарный JS-объект:
| Javascript: | //Конструктор объекта function myobject(object_name) { this.flag=false; //вот этот флаг должен и меняться this.object_name=object_name; //имя объекта, используемое для назначения атрибута ID элемента this.event_function=event_function; //обработчик события, который и будет менять флаг, и показывать его значение в элементе this.any_function=any_function; //просто функция некая } //Обработчик события function event_function(target_element) { this.flag=!this.flag; //КСТАТИ - здесь this.flag всегда изначально воспринимается как = false, и от этого отталкивается изменение его значения, даже если я в конструкторе поставлю this.flag=true document.getElementById(target_element).innerHTML="FLAG="+this.flag; //показываем на что изменился флаг } function any_function() { ... var myelement=document.createElement("element_tag"); myelement.setAttribute("id","element_id_"+this.object_name); //устанавливаем атрибут ID=element_id_[имя которое передали в конструкторе] myelement.onclick=new Function('event_function("element_id_"+this.object_name);'); //вызываем событие .... }
|
ПРОБЛЕМА:
Сойство this.flag - работает как глобальное для всех объектов на всю страницу, а не собственное для конкретно созданного объекта.
Следствие, сами понимаете, когда 1 экземпляр описанного выше класса создаем, все работает отлично. Но когда создаем 2 или более, то, соотв., для изменения содержимого элемента с false на true и наоборот нужно кликать иногда 2 раза.
Добавлено спустя 16 минут 35 секунд:
Есть конечно как всегда обходные пути, пока я вижу вот какие:
вариант 1. Создания какого-нить невидимого элемента с абсолютным позиционированием типа DIV с присвоением его атрибута ID=имя объекта_flag и содержимое его сделать равным значению флага, ну и его соотв. изменять через innerHTML при генерации события.
Этот вариант некрасив и его применять не хочу, разве что на самый худой конец, если вообще других вариантов не будет.
вариант 2. С созданием внешней переменной типа var flag_number_X=false и передачей ее в конструктор создаваемого объекта. Только вот флаг передастся не по ссылке, а лишь его значение, а как в JS по ссылке переменную в функцию передать я что-то не знаю (возможно ли вообще такое?) |
|
| В начало |
|
 |
|
|
 |
 dogma
aka Достоевский

Возраст: 27
Знак зодиака: 
Зарегистрирован: 20.12.2004
Сообщения: 1702
Откуда: Холмск
|
|
|
Цитата |
|
Помойму в JS передача переменной по ссылке не возможно. Как-то сам с такой проблемой сталкивался и на каком-то форуме нашел, что ДжаваСкрипт нет реализации передачи переменной по ссылке...
Добавлено спустя 10 минут 26 секунд:
Думаю, что this.flag изначально всегда равен FALSE, т.к. область видимости этой переменной ограничено телом функции event_function, т.е. это не та переменная, что объявлена в функции myobject _________________ Bonum initium est dimidium facti
SQL-задачи (on-line) |
|
| В начало |
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
to dogma.
а разве this не есть указатель на экземпляр класса myobject? _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
 dogma
aka Достоевский

Возраст: 27
Знак зодиака: 
Зарегистрирован: 20.12.2004
Сообщения: 1702
Откуда: Холмск
|
|
|
Цитата |
|
this ну вроде как да, вот только обращение к нему происходит из функции не myobject, а из event_function. В общем все выше сказанное мною это лишь предположение... Надо бы про ООП в js почитать. _________________ Bonum initium est dimidium facti
SQL-задачи (on-line) |
|
| В начало |
|
 |
 Kate
Постоянный участник

Возраст: 27
Знак зодиака: 
Зарегистрирован: 04.06.2007
Сообщения: 149
|
|
|
Цитата |
|
dogma,
вывела результат this.flag в документ и посморела, в действительности this.flag в функции event_fucntion = undefinded соответственно, поэтому эта функция про эту переменную вообще ничего не знает, и соотв. приравнивает это значение к false. |
|
| В начало |
|
 |
|