Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Битва гигантов: AVM1 vs. AVM2. Спешите видеть! Только у нас! (http://www.flasher.ru/forum/showthread.php?t=113128)

iNils 02.07.2008 16:06

Цитата:

Сообщение от chingachgoog (Сообщение 749451)
если хотите разобраться с объектами активации посмотрите посты 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-скрипте не может получить доступ к объекту активации функции, но может получить доступ к его свойствам. К свойствам, но не к самому объекту активации.

chingachgoog 02.07.2008 16:38

Цитата:

Сообщение от iNils (Сообщение 749515)
Ну давай.
...
привожу следующий код (смотреть с компиляцией под 6-ый плеер)

Это изначальная ошибка. Дело не в компиляции под 6-й плеер, а в наличии самого 6-го плеера. Просто, начиная с 7-го ФП объект активации перевели на быстрые регистры и он стал практически недоступен (по крайней мере для for in с ASsetPropFlags). Разумеется это было сделано не для того чтобы "прикрыть лавочку" или "не повадно было".
Т.е. если ты хочешь протестить свой код, то найди 6-й флеш-редактор (тот что MX) и протести там.

Цитата:

Сообщение от iNils (Сообщение 749515)
Объект активации функции - это внутренний механизм спецификации. Программа на 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".

iNils 02.07.2008 17:27

Цитата:

Сообщение от chingachgoog (Сообщение 749537)
Вообще можно, в том же ФП6. Достаточно дать ссылку на объект активации и он будет жить вечно :)

Нельзя. Или будешь спорить с спецификацией?:D Объект активации, это понятие плеера, а не понятие кода. Доступ к нему получить не возможно.

Цитата:

Сообщение от chingachgoog (Сообщение 749537)
Просто, начиная с 7-го ФП объект активации перевели на быстрые регистры и он стал практически недоступен

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

chingachgoog 02.07.2008 17:50

Цитата:

Сообщение от iNils (Сообщение 749553)
Нельзя. Или будешь спорить с спецификацией?:D Объект активации, это понятие плеера, а не понятие кода. Доступ к нему получить не возможно.

Добавил в пост выше :) (то что называется z - и есть ссылка на объект активации)

Цитата:

Сообщение от iNils (Сообщение 749553)
Гурского надо внимательнее читать :) Он написал, что на быстрые регистры перевели 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 пустой - это надо спросить у тех, кто знает как устроены сетинтервалы и сеттаймауты.

iNils 02.07.2008 18:09

Цитата:

Сообщение от chingachgoog (Сообщение 749563)
Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации.

Цитирую Гурского, страница 205
Цитата:

this - это свойство объекта активации, хранящие указатель на объект, методо которого является функция
И спецификацию 2-ой раз
Цитата:

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

chingachgoog 02.07.2008 19:08

Цитата:

Сообщение от iNils (Сообщение 749565)
Цитата:

Сообщение от chingachgoog
Т.е. вложенная функция, как и положено имеет свой this указывающий на объект активации.

Цитирую Гурского, страница 205
Цитата:

this - это свойство объекта активации, хранящие указатель на объект, методо которого является функция

Ну и где тут противоречие? Вложенная функция имеет свой объект активации. Но добраться до него мы не можем. Зато у нас есть указатель this этой вложенной функции, который указывает на объект, методом которого является функция - т.е. объект активации ВНЕШНЕЙ функции оболочки. Именно объект активации ВНЕШНЕЙ функции оболочки, ты и разбирал for in c ASsetPropFlags. Соответственно у этого объекта активации ВНЕШНЕЙ функции-оболочки есть свой указатель this, указывающий на объект, чьим методом является ВНЕШНЯЯ функция-оболочка.
Т.е. твои доводы, что вложенная функция своим this не указывает на объект активации ВНЕШНЕЙ функции-оболочки, оказались ошибочными.

Цитата:

Сообщение от iNils (Сообщение 749565)
И спецификацию 2-ой раз
...
Поэтому сослаться на объект активации мы не можем, это механизм плеера, а не кода.

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

riden 02.07.2008 21:04

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). Можно говорить лишь о качестве, а не о существовании.

iNils 02.07.2008 22:53

Цитата:

Сообщение от chingachgoog (Сообщение 749593)
Ну и где тут противоречие? Вложенная функция имеет свой объект активации. Но добраться до него мы не можем. Зато у нас есть указатель 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

iNils 02.07.2008 22:55

Цитата:

Сообщение от chingachgoog (Сообщение 749593)
Какое мне дело до спецификации...

Раз ты создал собственную область понимания, то разговор закончен.

etc 02.07.2008 23:09

riden, я просил точную копию своих классов. Мне не нужны другие примеры, я привел пример и прошу реализовать его же, на AS1. Без какого-либо вмешательства в схему.


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

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