powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Объект остаётся на месте. Куда деваются его свойства после первого рефреша таймера?
8 сообщений из 8, страница 1 из 1
Объект остаётся на месте. Куда деваются его свойства после первого рефреша таймера?
    #34736787
BlackNoise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите снять копии рефреш-функций с прототипа и передать в них параметры соответствующих объектов параметры должным образом. Должно получиться 100%-е клонирование, то есть чтобы в каждой копии помимо всего прочего содержался бы и свой собственный setTimeout. У меня же получается потеря значения после первого рефреша (потери объекта, как мне думалось ранее, оказывается, не происходит, однако ещё неизвестно толком, что это за объект, удерживающийся "в седле", на самом деле). Если ещё точнее, то потеря идёт даже не столько значений, а свойств объекта (id, value и т. п.). Привожу то, что имею. Вопрос: КУДА ДЕВАЮТСЯ СВОЙСТВА С ИХ ЗНАЧЕНИЯМИ и КАК ИХ УДЕРЖИВАТЬ "В СЕДЛЕ"?
Вполне возможно, что для сохранения исчезающих параметров нужно их до второго рефреша успеть поместить в массив, а при последующих рефрешах таймера доставать. Я пока не пробовал, но что-то мне подсказывает, что может и не выйти. А если и получится, то вышеозвученный вопрос остаётся в силе (из любознательности). Неужто нельзя без массивов и прочих отягощений?

Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
<HTML>
<HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
</STYLE>
<SCRIPT>
function Counter(){}

function refresher(obj) {
    this.obj = obj
    alert(this.obj) // объект сохраняется после любого количества рефрешей
    alert(this.obj.id) // становится 'undefined' со второго круга
    setTimeout("refresher('"+obj+"')",330) // возможно, проблема здесь, но вариации без кавычек (ссылка на функцию), подстановка this. и некоторые другие эксперименты не дали должного результата
}

Counter.prototype.toString = refresher
</SCRIPT>
</HEAD>

<BODY>
<TABLE style="border:none; background-color:#FFFFFF;" cellspacing=7 cellpadding=0>
  <TR>
    <TD>
    <TABLE class="tbl">
        <FORM id="form1">
            <TR>
                <TD class=parameters>value1:</TD>
                <TD><INPUT id="parameter1" value="17"></TD>
            </TR>
            <TR>
                <TD><INPUT class=send onClick="
                        bit1 = new Counter(this.form);
                        bit1.runner = this.form.elements['parameter'+this.form.id.match(/\d/)].value;
                        bit1.toString(this.form)"
                           type="button" value="Send"></TD>
            </TR>
        </FORM>
    </TABLE>
    </TD>
    <TD>
    <TABLE class="tbl">
        <FORM id="form2">
            <TR>
                <TD class=parameters>value2:</TD>
                <TD><INPUT id="parameter2" value="43"></TD></TR>
            <TR>
                <TD><INPUT class=send onClick="
                        bit2 = new Counter(this.form);
                        bit2.runner = this.form.elements['parameter'+this.form.id.match(/\d/)].value;
                        bit2.toString(this.form)"
                           type="button" value="Send"></TD>
            </TR>
        </FORM>
    </TABLE>
    </TD>
    <TD>
    <TABLE class="tbl">
        <FORM id="form3">
            <TR>
                <TD class=parameters>value3:</TD>
                <TD><INPUT id="parameter3" value="78"></TD></TR>
            <TR>
                <TD><INPUT class=send onClick="
                        bit3 = new Counter(this.form);
                        bit3.runner = this.form.elements['parameter'+this.form.id.match(/\d/)].value;
                        bit3.toString(this.form)"
                           type="button" value="Send"></TD>
            </TR>
        </FORM>
    </TABLE>
    </TD>
  </TR>
  <TR>
    <TH id="results1"> </TH>
    <TH id="results2"> </TH>
    <TH id="results3"> </TH>
  </TR>
</TABLE>

</BODY>
</HTML>


Возможно также, что ошибка закралась со все блоки типа:

Код:
1.
2.
3.
4.
5.
                <TD><INPUT class=send onClick="
                        bit1 = new Counter(this.form);
                        bit1.runner = this.form.elements['parameter'+this.form.id.match(/\d/)].value;
                        bit1.toString(this.form)"
                           type="button" value="Send"></TD>
...
Рейтинг: 0 / 0
Объект остаётся на месте. Куда деваются его свойства после первого рефреша таймера?
    #34736838
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старайтесь писать кратко, ясно и по существу. Как сообщения, так и исходный код.
Объясню что происходит:
Код: plaintext
1.
2.
function refresher(obj) {..}
Counter.prototype.toString = refresher
теперь функцию можно вызвать и глобально и как метод экземпляра. В первом случае this будет ссылаться на window(глобальный объект), а во втором на созданный Counter.

дальше при вызове функции как .toString() выполняется строчка:
Код: plaintext
setTimeout("refresher('"+obj+"')", 330 )
Это значит, через 330мс выполнится:
Код: plaintext
refresher("[object]")
И естественно this==window, а obj равен строке "[object]"
...
Рейтинг: 0 / 0
Объект остаётся на месте. Куда деваются его свойства после первого рефреша таймера?
    #34743494
BlackNoise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LINUXER
Код: plaintext
1.
2.
function refresher(obj) {..}
Counter.prototype.toString = refresher
теперь функцию

А в этом месте можно поподробнее?
Во-первых, что значит функцию? Речь, я так полагаю, идёт про нечто вроде newClonedInstanceFromTemplate = new Counter, а не про function refresher(obj) {..}, что в моём понимании является лишь шаблоном, или образчиком, или так называемым "объектом последующего прототипирования" с целью получения возможности снятия с него будущих копий?

LINUXER
можно вызвать и глобально и как метод


Во-вторых, что в данном случае будет являться методом? Пока я полагаю, что это obj.Counter. Если можно, простейший пример такого вызова.

LINUXER
экземпляра.


В-третьих, моя серость подсказывает мне, что экземпляром можно обозвать как очередной new Counter (т. е. это будет экземпляр-копия с той самой основной function refresher(obj)), так и любой объект DOM, то бишь HTML элемент.

LINUXER
В первом случае this будет ссылаться на window(глобальный объект), а во втором на созданный Counter.


В-четвёртых, интерсно про второе. Надо будет проверить сразу после разъяснений первых трёх пунктов.
...
Рейтинг: 0 / 0
Объект остаётся на месте. Куда деваются его свойства после первого рефреша таймера?
    #34743498
BlackNoise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя с первым я, похоже, погорячился. Скорее всего имелась в виду именно function refresher(obj).
...
Рейтинг: 0 / 0
Объект остаётся на месте. Куда деваются его свойства после первого рефреша таймера?
    #34745328
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
c какими-нибудь ООЯП знакомы?
BlackNoise
В-третьих, моя серость подсказывает мне, что экземпляром можно обозвать как очередной new Counter (т. е. это будет экземпляр-копия с той самой основной function refresher(obj)), так и любой объект DOM, то бишь HTML элемент.

да да экземпляр-счётчик - new Counter
BlackNoise
А в этом месте можно поподробнее?
Во-первых, что значит функцию? Речь, я так полагаю, идёт про нечто вроде newClonedInstanceFromTemplate = new Counter, а не про function refresher(obj) {..}, что в моём понимании является лишь шаблоном, или образчиком, или так называемым "объектом последующего прототипирования" с целью получения возможности снятия с него будущих копий?
...
Во-вторых, что в данном случае будет являться методом? Пока я полагаю, что это obj.Counter. Если можно, простейший пример такого вызова.

Переменная в JS хранит лишь ссылку(указатель) на объект (на функцию).
А после такого присвоения (function refresher(obj) {..};Counter.prototype.toString = refresher),
и Counter.prototype.toString, и refresher будут ссылаться на одну и ту же функцию.
Она не копируется и при создании экземпляра (new Counter). Также как не копируются методы при создании экземпляров класса в Java или C++. Достаточно того что в полях разные данные, и значит функции работают по-разному.

Оно для того всё и придуманно, чтобы избежать лишнего копирования=)

Пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
function Counter(){}
var refresher=function(){//всё равно что function refresher(){
alert(this==window)//вызвали глобально?
alert(this.toString)//вот такая функция есть у счётчиков
alert(this.prop)//а это есть олько у экземпляра counter
}
Counter.prototype.toString=refresher;
var counter=new Counter();
counter.prop="property"
//та же функция работает по-разному
counter.toString();
refresher();//всё равно что window.refresher();
toString - метод объекта counter. И всех экземпляров new Counter



PS setTimeout хорош когда нужно вызвать один раз. когда нужно вызывать периодично используется setInterval.

иначе получается цепочка вызовов и мысли всякие ...(накопировать много одинаковых функций). Вместо того чтоб копировать intervalId (timeoutId)
...
Рейтинг: 0 / 0
Объект остаётся на месте. Куда деваются его свойства после первого рефреша таймера?
    #34746274
BlackNoise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LINUXERc какими-нибудь ООЯП знакомы?

Знакомство скорее шапошное. И вопрос бы я задал немного иначе. "Использовал ли я ООП-возможности языка, который в себе их уже содержит?" Сейчас ведь очень много ООЯП, поэтому трудно было не нарваться на один из них, но можно же и 15 лет программировать на таком, при этом ни разу не обратившись к преимуществам ООП. Да, это довольно нелепо и трудно, так как человек волей-неволей развивается и приходит к необходимости задействовать более сложные и прогрессивные финты, нежели использовал до сих пор. Так же и у меня - слегка касался ООП, но понимал мало. В отдельных случаях я мог писать интересный и качественный ООП-код без глубокого понимания основ того, что я делаю. На уровне интуиции и реинжиниринга чужих исходников. Знаю, гнать таких интуитивных программистов надо, дабы не подрывали ряды профессиональных коллег, однако учиться никогда не поздно. А потом, когда язык предоставляет готовые возможности прикрутить встроенный метод или свойство через "." с минимальной и понятной документацией, то многие и останавливаются на этом формальном уровне, полагая, что знают ООП и не догадываясь об истинной природе этого явления. Они не знают, что могут сами создавать и методы, и свойства, и прочее, ещё более сложное и заточенное под ихние нужды.

LINUXERPS setTimeout хорош когда нужно вызвать один раз. когда нужно вызывать периодично используется setInterval.


Да-да, это все говорят, кое-где я и сам пробовал и то, и это. Но здесь для меня ситуация остаётся до сих пор неоднозначной, а ясность картины портит тот факт, что мне удаётся делать на setTimeout'е то же, что все рекомендуют делать на setInterval'е, не говоря уж об уже готовых професиональных библиотеках, в которых setInterval. Можно при этом предположить, что некорректность использования setTimeout, возникающая при runtime, пока не вылилась во что-то заметное, так что я наивно думаю, будто всё в порядке и в конечном счёте нет никакой разницы в использовании того или иного варианта. Однако, если есть желание удостовериться в некорректности, нужно создать провокационную ситуацию и отловить выскочившие прыщи. Или прозаниматься программированием на этом языке ещё лет пять, пока в один прекрасный день само не вскочит. А создавать искусственно провокационные ситуации - это надо уметь. Может, можно выловить потенциальные баги и иными, более лёгкими способами, но и здесь я не в теме.

LINUXERиначе получается цепочка вызовов и мысли всякие ...(накопировать много одинаковых функций). Вместо того чтоб копировать intervalId (timeoutId)
[/quot]

Ну, вообще-то, за мной ещё несколько вопросов на эту тему (если доживу до этого логически), учитывающих некоторые нюансы. Эти нюансы касаются не только моего кода, но и кода высокопрофессиональных библиотек, где эти нюансы не устранены, несмотря на профессиональность кода и довольно высокие к сегодняшнему дню номера версий (то есть разрабатываются уже давно, но это не спасло их от тех самых нюансов).

В остальном - спасибо за весьма грамотные разъяснения, хотя сразу-то не всё понятно, однако суть я уже уловил.
...
Рейтинг: 0 / 0
Объект остаётся на месте. Куда деваются его свойства после первого рефреша таймера?
    #34746275
BlackNoise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quote LINUXER]
Она не копируется и при создании экземпляра (new Counter). Также как не копируются методы при создании экземпляров класса в Java или C++.
Оно для того всё и придуманно, чтобы избежать лишнего копирования=)
[/quote]

Я так полагаю, что предположение о необходимости копирования прозвучало довольно глупо, так как в таком случае пришлось бы перед использованием предопределённых в языке функций и методов сперва клонировать их, а потом использовать в конкретном куске кода - и так всякий раз, когда нужно получить новый экземпляр предопределённых ресурсов языка. Но ведь так же не делается. Делается просто: нужно воспользоваться функцией получения текущего времени - берёшь и сразу же используешь, разве что разные параметры подставляешь. Однако, недаром же в некоторых случаях всё-таки подставляют new перед использованием той или иной встроенной функции времени... Получается, что нет никакого противоречия, так как new вроде как и не осуществляет копирования? Тогда что же - создание нового экземпляра объекта или функции для появления потенциальной возможности заполнения индивидуальными параметрами нового экземпляра? Ух, уже чувствую, что захожу в дебри...
...
Рейтинг: 0 / 0
Объект остаётся на месте. Куда деваются его свойства после первого рефреша таймера?
    #34746378
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlackNoise

Я так полагаю, что предположение о необходимости копирования прозвучало довольно глупо, так как в таком случае пришлось бы перед использованием предопределённых в языке функций и методов сперва клонировать их, а потом использовать в конкретном куске кода - и так всякий раз, когда нужно получить новый экземпляр предопределённых ресурсов языка. Но ведь так же не делается. Делается просто: нужно воспользоваться функцией получения текущего времени - берёшь и сразу же используешь, разве что разные параметры подставляешь. Однако, недаром же в некоторых случаях всё-таки подставляют new перед использованием той или иной встроенной функции времени... Получается, что нет никакого противоречия, так как new вроде как и не осуществляет копирования? Тогда что же - создание нового экземпляра объекта или функции для появления потенциальной возможности заполнения индивидуальными параметрами нового экземпляра? Ух, уже чувствую, что захожу в дебри...
new вызывает конструктор, в котором и определяются начальные свойства объекта. В конструктор можно передавать параметры. По сути function Counter(){} и есть конструктор.
new Date() (js) запоминает дату на момент создания. и теперь её можно получать в разных форматах, или инфу о ней

http://structuralist.narod.ru/it/internet/oop.htm
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1186
У JS много особенностей (интерпретируемый, вместо классов прототипы)
про js в другой вашей ветке давал ссылку на наблы.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Объект остаётся на месте. Куда деваются его свойства после первого рефреша таймера?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]