Форум 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)

chingachgoog 14.05.2008 14:24

Можно ли залезть в конструктор встроенных классов?
 
Например добавить уникальное свойство объекту при его создании?

add: нечто подобное я делал для мувиков
http://flasher.ru/forum/showpost.php...0&postcount=12

iNils 14.05.2008 14:34

А расширение уже не в моде?

chingachgoog 14.05.2008 15:39

Расширение включает в цепочку видимости какой-то класс. Т.е. объект наследует свойство. А нужно чтобы свойство задавалось, а не наследовалось. Т.к. свойство может быть уникальным.

etc 14.05.2008 15:41

Так опишите свойство в наследнике, а его значение задавайте извне.

iNils 14.05.2008 16:05

Цитата:

Сообщение от chingachgoog (Сообщение 739109)
Расширение включает в цепочку видимости какой-то класс. Т.е. объект наследует свойство. А нужно чтобы свойство задавалось, а не наследовалось. Т.к. свойство может быть уникальным.

Код:

class A {
        public var bum:Object = null;
        function A (c) {
                bum = c;
        }
}

Код:

class B extends A {
        public var pum:Object = null;
        function B (c, d) {
                super (c);
                pum = d;
        }
}

и все

chingachgoog 14.05.2008 16:08

Цитата:

Сообщение от __etc (Сообщение 739111)
Так опишите свойство в наследнике, а его значение задавайте извне.

Это сработает для объектов определенного подкласса.
(тогда бы я не стал и тему постить, т.к. до конструктора своего собственного класса я и так доберусь)
Но никак не сработает для ЛЮБОГО объекта.
Например такого:
obj={} или такого obj=[]
мне надо, чтобы у obj тут же было (или хотя бы через кадр) свое уникальное свойство.

iNils 14.05.2008 16:14

Код:

Object.prototype.a = 5;
Array.prototype.a = 6;
obj = {};
arr = [];
trace (obj.a);
trace (arr.a);

Только что мешает сделать свой класс и вместо {} [], вызывать через new?

chingachgoog 14.05.2008 16:25

Цитата:

Сообщение от iNils (Сообщение 739127)
Код:

Object.prototype.a = 5;
Array.prototype.a = 6;
obj = {};
arr = [];
trace (obj.a);
trace (arr.a);


Так это наследование свойства, которое заранее известно и вовсе не уникально. У всех объектов будет одно и то же значение свойства.

Цитата:

Сообщение от iNils (Сообщение 739127)
Только что мешает сделать свой класс и вместо {} [], вызывать через new?

Просто раздумываю над проблемой рекурсивного обегания всего и вся. И тут встают две проблемы:
1) у объектов нет свойства типа _parent
2) нельзя отличить ссылку на объект от самого объекта - и тут возможно зацикливание.

Конечно можно написать свои классы-аналоги и всегда использовать new, но это как-то громоздко выглядит.

iNils 14.05.2008 16:32

А чего то не заметил, где в {} [] передается свойство в конструктор. Что-то ты мутишь воду :)

chingachgoog 14.05.2008 17:14

В том-то и дело, что не передается - см. название темы.
Если бы можно было добавить в конструктор назначение уникального объекта...
Или хотя бы сделать по аналогии с решением для мувиков (но там решение было связано исключительно с самовызывающейся функцией onEnterFrame в прототипе)

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, время: 08:44.

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