Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Можно ли залезть в конструктор встроенных классов? (http://www.flasher.ru/forum/showthread.php?t=111979)

iNils 14.05.2008 19:13

Так, я вообще перестал понимать о чем идет. Какой еще уникальный объект и причем тут onEnterFrame?
Можно отойти от абстрактных желений и объяснить конкретно на примере?

wvxvw 14.05.2008 22:47

Мне кажется я понял, чего нужно, но чет не представляю, как это можно сделать =)
Код:

var obj = {
        toString:function():String {return 'foo' }
}
obj.obj = {};
trace(obj.obj.parent); // нужно 'foo'


chingachgoog 14.05.2008 23:41

Цитата:

Сообщение от iNils (Сообщение 739173)
Так, я вообще перестал понимать о чем идет. Какой еще уникальный объект и причем тут onEnterFrame?
Можно отойти от абстрактных желений и объяснить конкретно на примере?

Залезть в конструктор ВСТРОЕННЫХ классов нарямую мы не можем, только в их прототип. Поэтому в прототипе надо поставить некий САМОвключаемый обработчик, который позволил бы СРАЗУ при рождении объекта ВОЗДЕЙСТВОВАТЬ на него. Для мувиклипов идеальным обработчиком оказался onEnterFrame. Причем тут он - я указал в ссылке в топике.
Что хочу? Очень немногого :) Аналога _parent (wvxvw, правильно понял) для объектов и способность отличать ссылки на объект от самих объектов.

Конкретный пример:
Код:

obj1={}
obj2={}
obj1.obj2=obj2
obj2.obj1=obj1

Что теперь будет с рекурсивной функцией обхода объектов, включая вложенные?

iNils 15.05.2008 00:38

В отличии от мувиклипов, которое являются визуальными объектами и поэтому "физически" находятся в другом клипе и поэтому имеют родителей, объекты создаются в памяти и на них просто дается ссылка. Понятие родителя к ним не применимо.
То есть если взять пример
Код:

obj1 = {};
obj2 = {};
obj1.obj = obj2;
obj2.obj = obj1;

То обратившись к obj1.obj, а по сути к obj2, то obj1 не будет является для родителем. Вообще ни как.
А можно еще вот так написать
Код:

obj1 = {};
obj1.obj = obj1;

И что, obj1 является теперь для себя же родителем?

И как ты собрался отличать ссылку на объект от самого объекта, мне тоже не понятно.
Также не понятно, почем "взлом" встроенных классов кажется тебе более правильным решением, чем создание подкласса с нужными свойствами и называя это "громоздко выглядит".

Хочется присечь рекурсию кода выше? Можно сделать так:
Код:

obj1 = {};
obj2 = {};
obj1.obj = obj2;
obj2.obj = obj1;
function a (o, p) {
        for (arg in o) {
                trace (arg + "=" + o[arg]);
                if (o[arg] != p) {
                        a (o[arg], o);
                }
        }
}
a (obj1);


chingachgoog 15.05.2008 09:35

Цитата:

Сообщение от iNils (Сообщение 739277)
В отличии от мувиклипов, которое являются визуальными объектами и поэтому "физически" находятся в другом клипе и поэтому имеют родителей, объекты создаются в памяти и на них просто дается ссылка. Понятие родителя к ним не применимо.
То есть если взять пример
Код:

obj1 = {};
obj2 = {};
obj1.obj = obj2;
obj2.obj = obj1;

То обратившись к obj1.obj, а по сути к obj2, то obj1 не будет является для родителем. Вообще ни как.

Это не совсем так. В данном случае имеются:
1) два объекта у которых ОБЩИЙ родитель- _root или временная диаграмма, где они расположены.
2) в каждом из объектов есть ССЫЛКА на другой объект, естественно помещение ссылки в какой-то объект не значит, что он стал родителем. :)

В коде:
Код:

obj1={}
obj1.obj2={}

Объект obj1.obj2 имеет своим родителем объект obj1

Цитата:

Сообщение от iNils (Сообщение 739277)
И как ты собрался отличать ссылку на объект от самого объекта, мне тоже не понятно.

Если объект имеет родителем тот же объект, свойства которого просматриваются - то это не ссылка, а именно объект.

Цитата:

Сообщение от iNils (Сообщение 739277)
Хочется присечь рекурсию кода выше? Можно сделать так:
Код:

obj1 = {};
obj2 = {};
obj1.obj = obj2;
obj2.obj = obj1;
function a (o, p) {
        for (arg in o) {
                trace (arg + "=" + o[arg]);
                if (o[arg] != p) {
                        a (o[arg], o);
                }
        }
}
a (obj1);


Хороший код. Но повиснет на троичном зацикливании... Что не случилось бы, если бы можно было различать ссылки и сами объекты.

iNils 15.05.2008 09:55

Цитата:

Сообщение от chingachgoog (Сообщение 739306)
Это не совсем так. В данном случае имеются:
1) два объекта у которых ОБЩИЙ родитель- _root или временная диаграмма, где они расположены.

Еще раз повторю. У объектов НЕТ родителей. Объекты не храняться в каком либо объекте, мувиклипе и т.п. Там храняться только ссылки на объекты, а сами объекты храняться в памяти.

Пример. Создаем мувиклип с объектом. Даем на объект ссылку и удаляем мувиклип. Мувиклипа нет, а объект который создавали якобы в нем, существует. Потому, что его в клипе и не было. Была только ссылка.
Код:

var mc:MovieClip = this.createEmptyMovieClip ("mc", 0);
mc.obj1 = {a:5};
var objLink = mc.obj1;
trace (mc + " | " + mc.obj1.a + " | " + objLink.a);
mc.removeMovieClip ();
delete mc;
trace (mc + " | " + mc.obj1.a + " | " + objLink.a);

Цитата:

Сообщение от chingachgoog
если бы можно было различать ссылки и сами объекты.

У тебя никогда не было и не будет самого объекта, только ссылка на него.

chingachgoog 15.05.2008 11:11

iNils, спасибо!


Часовой пояс GMT +4, время: 07:39.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.