Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.05.2008, 20:01
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 11  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Как правильно сказал iNils, есть проблема - в функции не должно быть явно указано имя объекта. Поэтому код типа
Цитата:
delete zz
не подходит Честно говоря не ожидал что его предложат

Но и создавать объект, дополнительно задавая ему (по сути вручную) параметром его же имя - тоже неверно. Если разобраться, то iNils выполнил тот же код:
Цитата:
delete zz
только более извращенно.

в моем коде, типа
Цитата:
Object.prototype.del=function(){
this.death=true
for (var i in _root) {
if (_root[i].death){
delete _root[i]
}
}
}
есть два слабых места:
1) объект может лежать вовсе не на _root, а так как свойства _parent у объекта нет, придется искать его какой-нибудь рекурсией
2) может случиться перекрытие имен с death - а вдруг у объекта уже есть смысловая переменная с таким же именем?

Старый 06.05.2008, 01:09
GFreemen вне форума Посмотреть профиль Отправить личное сообщение для GFreemen Найти все сообщения от GFreemen
  № 12  
Ответить с цитированием
GFreemen
 
Аватар для GFreemen

Регистрация: Oct 2006
Адрес: Волгодонск
Сообщений: 182
а если так
Код:
var zz1:Object={};
zz={};
zz.qwe=function(){
	kill(this);
}
function kill (asd) {
	for(var i in this){
		if(this[i]===asd){
			delete this[i];
			trace(i+"   "+this[i]);//zz   undefined
		}
	}
}
zz.qwe();
trace("end "+zz);//end undefined
trace("end1 "+zz1);//end1 [object Object]


Последний раз редактировалось GFreemen; 06.05.2008 в 01:48.
Старый 06.05.2008, 10:57
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 13  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Объекты не должны сами себя удалять, это ошибка в дизайне...
__________________
Hell is the possibility of sanity

Старый 06.05.2008, 12:35
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 14  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Цитата:
Сообщение от GFreemen Посмотреть сообщение
а если так
Та же дыня только сбоку

Код:
...
function kill (asd) {
	trace("this="+this)
	for(var i in this){
		trace("i="+i+" this[i]="+this[i]) 
		if(this[i]===asd){
			delete this[i];
			trace(i+"   "+this[i]);//zz   undefined
		}
	}
}
...
Т.е. this в данном случае - это тот же _root или любая другая временная диаграмма где находиться метод kill и объект (они должны находиться на одной временной диаграмме). В этом то и главная засада, что объект не знает где он находиться
Но хорошо, что проблема с перекрыванием имен оказалась надуманной мной - переменная типа death не требуется:
Код:
Object.prototype.del=function(){
	//this.death=true
	for (var i in _root) {
		if (_root[i]==this){
			delete _root[i]
		}
	}
} 

zz={}
zz.prop="qwerty"
trace(zz+" "+zz.prop)

zz.del()
trace(zz+" "+zz.prop)

Цитата:
Сообщение от wvxvw
Объекты не должны сами себя удалять, это ошибка в дизайне...
А что тут криминального? По-моему вполне законное и удобное желание. Тем более что они МОГУТ себя удалять - только не знают где они находяться.

add:
Не люблю рекурсию, но пока ничего иного не придумал:

Код:
Object.prototype.del=function(path, firstThis){
	if(arguments.caller==null){
		var parent=_root
		var firstThis=this
	} else {
		var parent=path
		var firstThis=firstThis
	}
	
	for (var i in parent) {
		if (parent[i]==firstThis){
			delete parent[i]
			return null			
		}
		if (typeof(parent[i])=='movieclip' || typeof(parent[i])=='object'){
			if (arguments.callee(parent[i], firstThis)==null){
				return null
			}
		}
	}
	
	for (var i in _global) {
		if (_global[i]==firstThis){
			delete _global[i]
			return null			
		}
		if (typeof(_global[i])=='movieclip' || typeof(_global[i])=='object'){
			if (arguments.callee(_global[i], firstThis)==null){
				return null
			}
		}
	}
}
Вроде убивает все и вся.


Последний раз редактировалось chingachgoog; 06.05.2008 в 14:00.
Старый 06.05.2008, 14:02
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 15  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
>>Тем более что они МОГУТ себя удалять ..
во всех приведенных примерах, насколько я смог понять, экземпляры объектов НЕ УДАЛЯЮТ САМИ СЕБЯ, что они делать не могут и не должны по определению. А отдать другому объекту-киллеру ссылку на себя с призывом "вот он я, убей меня быстрее!" - что тут заморочного? всегда так и делают в принципе. то что в прототипе вы прописываете метод del, ничего не меняет по сути, только вносит путаницу и все.

Старый 06.05.2008, 14:08
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 16  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Цитата:
Сообщение от alexcon314 Посмотреть сообщение
>>Тем более что они МОГУТ себя удалять ..
во всех приведенных примерах, насколько я смог понять, экземпляры объектов НЕ УДАЛЯЮТ САМИ СЕБЯ, что они делать не могут и не должны по определению. А отдать другому объекту-киллеру ссылку на себя с призывом "вот он я, убей меня быстрее!" - что тут заморочного? всегда так и делают в принципе.
В этом случае можно сказать, что и мой_мувик в коде
Код:
мой_мувик.removeMovieClip()
не удаляет сам себя а лишь отдает другому объекту (команде) киллеру ссылку на себя с призывом "вот он я, убей меня быстрее!"
А замороченного тут только то, что объект не знает ни своего имени ни своего родителя.

Цитата:
Сообщение от alexcon314 Посмотреть сообщение
>>то что в прототипе вы прописываете метод del, ничего не меняет по сути, только вносит путаницу и все.
В чем путаница не понял?

Старый 06.05.2008, 14:29
Vertax вне форума Посмотреть профиль Отправить личное сообщение для Vertax Найти все сообщения от Vertax
  № 17  
Ответить с цитированием
Vertax

Регистрация: Oct 2005
Сообщений: 207
Развивая мысль, может так:
Код:
Object.prototype.del=function(LVL)
{
	if (LVL == undefined) LVL = _root;
	for (var i in LVL)
	{
		if (LVL[i] == this){delete LVL[i]; return true;}
		else if (typeof(LVL[i]) != "function" && this.del(LVL[i])){return true;}
	}
	return false;
}

mc = _root.createEmptyMovieClip("aaa", 1);
mc.zz = {};
mc.zz.prop="qwerty";
trace(mc.zz+" "+mc.zz.prop);

mc.zz.del();
trace(mc.zz+" "+mc.zz.prop);

Старый 06.05.2008, 14:44
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 18  
Ответить с цитированием
chingachgoog
Banned
[+4 01.02.09]
[+1 01.02.09]
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Цитата:
Сообщение от Vertax Посмотреть сообщение
Развивая мысль, может так:
Можно и так, если поставить уловитель _global и отсекатель элементарных данных (строки, булевые величины и числа)

Старый 06.05.2008, 15:42
Vertax вне форума Посмотреть профиль Отправить личное сообщение для Vertax Найти все сообщения от Vertax
  № 19  
Ответить с цитированием
Vertax

Регистрация: Oct 2005
Сообщений: 207
Цитата:
Можно и так, если поставить уловитель _global
Код:
Object.prototype.del=function(LVL)
{
	if (LVL == undefined) 
	{
		LVL = _root;
		for (var i in _global) if (_global[i] == this){delete _global[i]; return true;}
	}
	for (var i in LVL)
	{
		if (LVL[i] == this){delete LVL[i]; return true;}
		else if (typeof(LVL[i]) != "function" && this.del(LVL[i])){return true;}
	}
	return false;
}
Цитата:
и отсекатель элементарных данных (строки, булевые величины и числа)
Не согласен, т.к. они будут только усложнять конструкцию.

Недостаток в коллекцию:
Код:
a = {};
a.OBJ = "Hello";

b = {};
b.parent = _root;

a.del();

Старый 06.05.2008, 16:09
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 20  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ей богу, вы занимаетесь ерундой. Не нужно удалять объекты из себя, это не правильно логически и может привести к сбою, например, если вы попытаетесь этот ваш метод вызвать в теле цикла фор-ин. (скорее всего он просто не сработает)
__________________
Hell is the possibility of sanity

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:20.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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