Вход

Просмотр полной версии : Можно ли залезть в конструктор встроенных классов?


chingachgoog
14.05.2008, 14:24
Например добавить уникальное свойство объекту при его создании?

add: нечто подобное я делал для мувиков
http://flasher.ru/forum/showpost.php?p=706520&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
Расширение включает в цепочку видимости какой-то класс. Т.е. объект наследует свойство. А нужно чтобы свойство задавалось, а не наследовалось. Т.к. свойство может быть уникальным.

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
Так опишите свойство в наследнике, а его значение задавайте извне.

Это сработает для объектов определенного подкласса.
(тогда бы я не стал и тему постить, т.к. до конструктора своего собственного класса я и так доберусь)
Но никак не сработает для ЛЮБОГО объекта.
Например такого:
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
Object.prototype.a = 5;
Array.prototype.a = 6;
obj = {};
arr = [];
trace (obj.a);
trace (arr.a);


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


Только что мешает сделать свой класс и вместо {} [], вызывать через 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
Так, я вообще перестал понимать о чем идет. Какой еще уникальный объект и причем тут 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
В отличии от мувиклипов, которое являются визуальными объектами и поэтому "физически" находятся в другом клипе и поэтому имеют родителей, объекты создаются в памяти и на них просто дается ссылка. Понятие родителя к ним не применимо.
То есть если взять пример
obj1 = {};
obj2 = {};
obj1.obj = obj2;
obj2.obj = obj1;
То обратившись к obj1.obj, а по сути к obj2, то obj1 не будет является для родителем. Вообще ни как.


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

В коде:
obj1={}
obj1.obj2={}

Объект obj1.obj2 имеет своим родителем объект 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);

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

iNils
15.05.2008, 09:55
Это не совсем так. В данном случае имеются:
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
15.05.2008, 11:11
iNils, спасибо!