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

Вернуться   Форум Flasher.ru > Flasher.ru > Флейм

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 02.07.2008, 16:06
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 431  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
Сообщение от chingachgoog Посмотреть сообщение
если хотите разобраться с объектами активации посмотрите посты 408 и 410.
Ну давай. Смотрим пост 410, а именно его часть
Цитата:
А this указывает на объект активации только в том случае, если функция вложена (тогда this из вложенной функции указывает на объект активации функции-оболочки)
привожу следующий код (смотреть с компиляцией под 6-ый плеер)
Код:
cx = 1;
function a () {
}
function b () {
	function c () {
		ASsetPropFlags (this, null, null, 1);
		for (var i in this) {
			trace ("\t" + i + " = " + this[i]);
		}
	}
	trace ((cx++) + ".");
	a.d = c;
	c ();
	trace ((cx++) + ".");
	a.d ();
}
b ()
new b ();
setTimeout (b, 1000);
он выдает следующее
Код:
1.
	c = [type Function]
	arguments = 
	this = _level0
2.
	d = [type Function]
	prototype = [object Object]
	__proto__ = [object Object]
	constructor = [type Function]
3.
	c = [type Function]
	super = [object Object]
	arguments = 
	this = [object Object]
4.
	d = [type Function]
	prototype = [object Object]
	__proto__ = [object Object]
	constructor = [type Function]
5.
	c = [type Function]
	super = [type Function]
	arguments = 
	this = 
6.
	d = [type Function]
	prototype = [object Object]
	__proto__ = [object Object]
	constructor = [type Function]
Особенно интересен пункт 5. Функция вложена, this есть и должен указывать на объект активации, а он показывает undefined (хотя там пустота, надо помнить, что в 6-ом плеере undefined не выводится в трейс, если в трейсе есть еще что-то). То есть, свойства объекта активации есть, а самого объекта нет! Это и доказывает, что this не ссылается на объект активации, о чем было заявлено в посте 410.

Дополнение, наткнулся на пост в блоге Нокса. Там он цитирует спецификацию ECMA-262
Цитата:
The activation object is purely a specification mechanism. It is impossible for ECMAscript program to access the activation object. It can access members of the activation object, but not the activation object itself.

Объект активации функции - это внутренний механизм спецификации. Программа на ECMA-скрипте не может получить доступ к объекту активации функции, но может получить доступ к его свойствам. К свойствам, но не к самому объекту активации.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Цитата:
Сообщение от iNils Посмотреть сообщение
Ну давай.
...
привожу следующий код (смотреть с компиляцией под 6-ый плеер)
Это изначальная ошибка. Дело не в компиляции под 6-й плеер, а в наличии самого 6-го плеера. Просто, начиная с 7-го ФП объект активации перевели на быстрые регистры и он стал практически недоступен (по крайней мере для for in с ASsetPropFlags). Разумеется это было сделано не для того чтобы "прикрыть лавочку" или "не повадно было".
Т.е. если ты хочешь протестить свой код, то найди 6-й флеш-редактор (тот что MX) и протести там.

Цитата:
Сообщение от iNils Посмотреть сообщение
Объект активации функции - это внутренний механизм спецификации. Программа на ECMA-скрипте не может получить доступ к объекту активации функции, но может получить доступ к его свойствам. К свойствам, но не к самому объекту активации.
Вообще можно, в том же ФП6. Достаточно дать ссылку на объект активации и он будет жить вечно

add:
Код:
function b () {
	function c () {
		trace(this)
		z=this
	}
	c ();
}
b ()
trace(z)

ASsetPropFlags (z, null, null, 1);
		for (var i in z) {
			trace ("\t" + i + " = " + z[i]);
		}
Получаем:

Код:
[type Object]
[type Object]
	c = [type Function]
	arguments = 
	this = _level0
И ничего удивительного тут нет. Реальный this функции "с" показывает, как и ожидается на объект активации функции "b".
А этот объект активации (функции "b", а не "с"!) содержит в себе указатель this, куда? Правильно, на рут - тот объект, чьим методом является функция "b".


Последний раз редактировалось chingachgoog; 02.07.2008 в 17:33.
Старый 02.07.2008, 17:27
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 433  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
Сообщение от chingachgoog Посмотреть сообщение
Вообще можно, в том же ФП6. Достаточно дать ссылку на объект активации и он будет жить вечно
Нельзя. Или будешь спорить с спецификацией? Объект активации, это понятие плеера, а не понятие кода. Доступ к нему получить не возможно.

Цитата:
Сообщение от chingachgoog Посмотреть сообщение
Просто, начиная с 7-го ФП объект активации перевели на быстрые регистры и он стал практически недоступен
Гурского надо внимательнее читать Он написал, что на быстрые регистры перевели this и arguments, а не объект активации.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Цитата:
Сообщение от iNils Посмотреть сообщение
Нельзя. Или будешь спорить с спецификацией? Объект активации, это понятие плеера, а не понятие кода. Доступ к нему получить не возможно.
Добавил в пост выше (то что называется z - и есть ссылка на объект активации)

Цитата:
Сообщение от iNils Посмотреть сообщение
Гурского надо внимательнее читать Он написал, что на быстрые регистры перевели this и arguments, а не объект активации.
Точно.

Теперь продолжим с "доказывающим примером"

Код:
function b () {
	function c () {
		trace(this)
		z=this
	}
	c ();
}
setTimeout (b, 1000);

setTimeout(function(){
					trace(z)
ASsetPropFlags (z, null, null, 1);
		for (var i in z) {
			trace ("\t" + i + " = " + z[i]);
		}
					},2000)
выводит:
Код:
[type Object]
[type Object]
	c = [type Function]
	super = [type Function]
	arguments = 
	this =
Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации. ЧТД
А вот почему у функции-оболочки указатель this пустой - это надо спросить у тех, кто знает как устроены сетинтервалы и сеттаймауты.

Старый 02.07.2008, 18:09
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 435  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
Сообщение от chingachgoog Посмотреть сообщение
Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации.
Цитирую Гурского, страница 205
Цитата:
this - это свойство объекта активации, хранящие указатель на объект, методо которого является функция
И спецификацию 2-ой раз
Цитата:
Объект активации функции - это внутренний механизм спецификации. Программа на ECMA-скрипте не может получить доступ к объекту активации функции, но может получить доступ к его свойствам. К свойствам, но не к самому объекту активации.
Поэтому сослаться на объект активации мы не можем, это механизм плеера, а не кода.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Цитата:
Сообщение от iNils Посмотреть сообщение
Цитата:
Сообщение от chingachgoog
Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации.
Цитирую Гурского, страница 205
Цитата:
this - это свойство объекта активации, хранящие указатель на объект, методо которого является функция
Ну и где тут противоречие? Вложенная функция имеет свой объект активации. Но добраться до него мы не можем. Зато у нас есть указатель this этой вложенной функции, который указывает на объект, методом которого является функция - т.е. объект активации ВНЕШНЕЙ функции оболочки. Именно объект активации ВНЕШНЕЙ функции оболочки, ты и разбирал for in c ASsetPropFlags. Соответственно у этого объекта активации ВНЕШНЕЙ функции-оболочки есть свой указатель this, указывающий на объект, чьим методом является ВНЕШНЯЯ функция-оболочка.
Т.е. твои доводы, что вложенная функция своим this не указывает на объект активации ВНЕШНЕЙ функции-оболочки, оказались ошибочными.

Цитата:
Сообщение от iNils Посмотреть сообщение
И спецификацию 2-ой раз
...
Поэтому сослаться на объект активации мы не можем, это механизм плеера, а не кода.
Движенья нет - сказал один мудрец. Другой встал и начал пред ним ходить...
Какое мне дело до спецификации, когда я только что при тебе сделал указатель на объект активации (z) и он действует уже ПОСЛЕ выполнения функции? В любое время к нему можно обратиться.

Старый 02.07.2008, 21:04
riden вне форума Посмотреть профиль Отправить личное сообщение для riden Найти все сообщения от riden
  № 437  
Ответить с цитированием
riden
 
Аватар для riden

Регистрация: Jun 2005
Сообщений: 147
По умолчанию OOP AS1 В ДЕЙСТВИИ 3 in 1: инкапсуляция, наследование, полиморфизм

OOP AS1 В ДЕЙСТВИИ 3 in 1: инкапсуляция, наследование, полиморфизм
Следует заметить что НАСЛЕДОВАНИЕ в AS1 - более широкое понятие. Здесь - наследование на уровне экземпляр-класс, наследование свойств прототипов класса, надкласса, наследование свойств созданных внутри конструктора и пр... В этом плане AS1 более гибок... такое наследование позволяет экономить память, ресурсы компьютора.
Я покажу наследование - в "классическом" понимании, то есть как в AS3, Java, C#. Код:
*IA - in action, в действии
Код:
//Класс Rectangle - надкласс класса Square
function Rectangle(width,height){
	this.test = "test";
	var l2this=this;
	function Private(){trace(l2this.test);}//приват метод// ИНКАПСУЛЯЦИЯ IA
	this.callPrivate=function(){Private();}
	this.width=width;
	this.height=height;
	this.ctest=function(){l2this.test="null";}
	this.getArea=function(){return l2this.width*l2this.height;}
}


//наследование свойств созданных в конструкторе - НАФИГ
//Square.prototype = new Rectangle();

//для того что бы были видны свойства в прототипе надкласса - НАФИГ
//Square.prototype.__proto__= Rectangle.prototype;

//Класс Square - Подкласс класса Rectangle
function Square(size){
	this.superClass = Rectangle;

	//вызов этой функции обеспечивает истинный Полиморфизм :)
	//Передача параметров в надкласс //аналог super
 	this.superClass(size,size);//вызывается каждый раз при создании экземпляра
	
	this.size=size;
	ASSetPropFlags(this,"width,height",7,null);//скрытие, защита непотребных свойств
	//trace(this.width);//4, 5 //НАСЛЕДОВАНИЕ IA #1 //OK, свойства видны
}

//создание объектов с различной площадью
var sq=new Square(4); //ПОЛИМОРФИЗМ IA #1
var sq2=new Square(5);
//sq.test="0";trace(sq2.test);//test //ПОЛИМОРФИЗМ IA #2 :)

//метод изменяет свойство test экземпляра sq
//sq.ctest(); trace(sq.test);trace(sq2.test);//null test//все ОК. ПОЛИМОРФИЗМ IA #3

//sq.width=30;trace(sq.width);//4 - OK // не переопределяется //ЗАЩИТА РАБОТАЕТ
//trace(sq2.width);//5 //у экземпляра есть свойство надкласса //НАСЛЕДОВАНИЕ IA #2

//у экземпляров есть метод надкласса
//trace(sq.getArea());//16 //ПОЛИМОРФИЗМ IA #4 + НАСЛЕДОВАНИЕ IA #3
//trace(sq2.getArea());//25 //ПОЛИМОРФИЗМ IA #4 + НАСЛЕДОВАНИЕ IA #3
AS1 - истинный ООП (2 __etc). Можно говорить лишь о качестве, а не о существовании.
__________________
видеоигры - высший вид искусства


Последний раз редактировалось riden; 03.07.2008 в 01:11. Причина: исправление ошибки в слове "приват"
Старый 02.07.2008, 22:53
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 438  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
Сообщение от chingachgoog Посмотреть сообщение
Ну и где тут противоречие? Вложенная функция имеет свой объект активации. Но добраться до него мы не можем. Зато у нас есть указатель this этой вложенной функции, который указывает на объект, методом которого является функция - т.е. объект активации ВНЕШНЕЙ функции оболочки. Именно объект активации ВНЕШНЕЙ функции оболочки, ты и разбирал for in c ASsetPropFlags. Соответственно у этого объекта активации ВНЕШНЕЙ функции-оболочки есть свой указатель this, указывающий на объект, чьим методом является ВНЕШНЯЯ функция-оболочка.
Т.е. твои доводы, что вложенная функция своим this не указывает на объект активации ВНЕШНЕЙ функции-оболочки, оказались ошибочными.
Ты не верно истолковываешь что такое объект активации. Object и объект активации это совсем разные вещи.
Код:
function b () {
	trace ("\tb:" + (this instanceof Object));
	function c () {
		trace (this);
		z = this;
		trace ("\t\t\t" + (this instanceof Object));
	}
	c ();
}
trace ("E")
e = new b ();
trace ("\tz:" + (z instanceof Object));
trace ("R")
r = b ();
trace ("\tz:" + (z instanceof Object));
trace ("Z")
setTimeout (b, 10);
setTimeout (function () {
	trace (z);
	trace ("\tz:" + (z instanceof Object));
}, 20);

Код:
E
	b:true
[type Object]
			false
	z:false
R
	b:true
[type Object]
			false
	z:false
Z
	b:false
[type Object]
			false
[type Object]
	z:false
А ты знаешь, что любой объект наследуется от Object
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 02.07.2008, 22:55
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 439  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Цитата:
Сообщение от chingachgoog Посмотреть сообщение
Какое мне дело до спецификации...
Раз ты создал собственную область понимания, то разговор закончен.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 02.07.2008, 23:09
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 440  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
riden, я просил точную копию своих классов. Мне не нужны другие примеры, я привел пример и прошу реализовать его же, на AS1. Без какого-либо вмешательства в схему.


Последний раз редактировалось etc; 02.07.2008 в 23:12.
Создать новую тему Ответ Часовой пояс GMT +4, время: 18:32.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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