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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.02.2014, 11:33
dark256 вне форума Посмотреть профиль Отправить личное сообщение для dark256 Посетить домашнюю страницу dark256 Найти все сообщения от dark256
  № 1  
Ответить с цитированием
dark256
 
Аватар для dark256

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
По умолчанию Локальные переменные и инстансы функций

Стал тут выдирать из кодов всякие вкусные фрагменты и формировать из них некую либу.
По мере формирования оной пришел к выводу, что все-таки мне нужны классы и ООП.
По сути - думал, что надо new my_class() и в каждой инстанции будут храниться свои переменные данные и т.п.

Но попробовал все-таки сделать через функции. Упрощенно это выглядит так:

Код AS1/AS2:
function initACCU( VAL ){
 
	var ACCUTotal = VAL
 
	function getACCU(){ return ACCUTotal }	
 
	return { getAccu:Function = getACCU }
}
 
var AC1:Object = initACCU( 100 )
var AC2:Object = initACCU( 200 )
 
trace( AC1.getAccu() )		// 100
trace( AC2.getAccu() )		// 200
То есть все работает так, как и планировалось. Два вызова одной и той же функции имеют свои разные локальные переменные. Классы не понадобились. Я в замешательстве. В двух словах мне может кто-то объяснить - как и почему оно работает? Отработавшая функция создает какой-то инстанс?
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2

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

блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
Отправить сообщение для Hauts с помощью ICQ Отправить сообщение для Hauts с помощью Skype™
Цитата:
одной и той же функции
Не одной и той же.

На самом деле в initACCU идет засорение памяти с помощью вложенных функций.

Как это работает?

1. Запускаем initACCU
2. Грубо говоря, создается новый объект с полем "getAccu", значением которого является функция. При чем функция, создаваемая каждый новый раз, как вызывается initACCU.

Когда обращаемся к AC1.getAccu() ( или AC2.getAccu() ) — по-сути, обращаемся к двум разным методам. Но благодаря тому, что они "обернуты" в два разных объекта, а сами называются одинаково, и создается ощущение, что "Вроде все одинаково, а результаты разные".

Но относительно инстансов классов — это все весьма ложные ощущения, которые при серьезной задаче сильно осложнят всё. Лучше использовать по-честному классы.

Данный код можно и по-другому написать, кстати:

Код AS1/AS2:
var a1 = {v:1, getV : function(){ return this.v }};
var a2 = {v:2, getV : function(){ return this.v }};
 
a1.getV(); // 1
a2.getV(); // 2
— внешне похоже, а по-факту разные объекты.

Добавлено через 3 минуты
Еще вариант, но уже более близкий к классам:
Код AS1/AS2:
function ACCU( val ){
    this.ACCUTotal = val;
}
ACCU.prototype.getAccu = function(){
    return this.ACCUTotal;
}
 
trace( (new ACCU(1)).getAccu() ); // 1
trace( (new ACCU(2)).getAccu() ); // 2
Но точно не уверен, что будет работать. Просто с прототипами в ас2 стал разбираться уже после того, как хорошенько познакомился с ас3, поэтому исключительно поверхностно.
__________________
hauts.ru

Старый 28.02.2014, 12:07
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 3  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Фукнция возвращаемая из функции, продолжает ссылаться на объект активатор функции (из которой её вернули). В ас2 использовал в делегате + для вызова обработчика с параметрами.

Старый 28.02.2014, 12:08
dark256 вне форума Посмотреть профиль Отправить личное сообщение для dark256 Посетить домашнюю страницу dark256 Найти все сообщения от dark256
  № 4  
Ответить с цитированием
dark256
 
Аватар для dark256

блогер
Регистрация: Apr 2008
Адрес: SPb
Сообщений: 3,718
Записей в блоге: 5
Отправить сообщение для dark256 с помощью ICQ Отправить сообщение для dark256 с помощью Skype™
Угу... спасибо, буду обдумывать. Буду пробовать твой вариант. Интересно. Почитаю попробую.

Добавлено через 1 минуту
Цитата:
Сообщение от udaaff Посмотреть сообщение
продолжает ссылаться на объект активатор функции
ВОТ! Вот теперь понятно откуда ноги растут! Спасибо!

Добавлено через 5 минут
Цитата:
Сообщение от Hauts Посмотреть сообщение
Данный код можно и по-другому написать, кстати:
var a1 = {v:1, getV : function(){ return this.v }};
Так как я привел основной фрагмент кода, который меня заинтересовал, я не стал публиковать еще 200 строк кода в этой функции. Так что в строчку не влезет ))))
__________________
FLASHER.MAP SOUNDSTAGE / CS3 / AS2

Старый 28.02.2014, 12:56
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 5  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
По сути ты сделал класс initACCU.
AS2 классы так и создаются. Компилятор их просто разворачивает в функции
типа
Код AS1/AS2:
class mypack.MyClass {
     var myProp = "myProp";
     function MyClass(param){
        trace("constructor" + param);
    }
    function mymethod() {
        trace("mymethod " + myProp);
    }
}
превращается в
Код AS1/AS2:
_global.mypack = {}
_global.mypack.MyClass = function(param) {
  this.myProp = "myProp";
  trace("constructor" + param);
 
   this.mymethod = function() {
        trace("mymethod " + myProp);
   }
}
__________________
Отряд Котовскага

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

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

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


 


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


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