Форум 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)

riden 30.06.2008 21:09

2 Inils: это здесь причем. Этот код я совершенно к другому вопросу привел. Нет конечно.
А приватный метод вот - pMetA
Код:

function Class1(){
//паблик свойство
this.a = 4;
var pa = this;//ссылка
//приват метод изменяте паблик свойство
function pMetA(){pa.a=10;}

//паблик методы
function pmet1(){pMetA();}
function pmet2(){trace("do pmet2");}
this.met1=pmet1;//паблик метод
this.met2=pmet2; //паблик метод

}
////////////////////////////////////////
var obj = new Class1();
var obj1 = new Class1();

trace(obj.a);//4
obj.met1();
trace(obj.a);//10
trace(obj1.a);//4
obj1.met1();
trace(obj1.a);//10

2 __etc:
Цитата:

Вы создали свойство в анонимной области видимости, после этого приплетаете объект активации (arguments.caller, вы знаете, что это такое?), который вообще отношения к ней не имеет.
Нет, это вы Гурского не понимаете.
argumetns.callee - возвращает не объект активации, а определение функции, короче ссылается на саму функцию. А объект активации, как я уже писал - это объект который вызывает функцию. Код функции, например выполняется при использовании оператора new Func, при создании экземпляра класса(функции).
Вот так будет правильно:
Код:

function Class1(a){
this.a=a;
        trace (this); //[object Object] //указатель на obj - экземпляр класса Class1
        function localFunc(){
                this.b=2;
                trace(this); //[type Object]
                trace(this.arguments);//аргумент функции внешней
                                        //это подтверждает что объект активации - внешняя функция (Class1)
                trace(this.a); //undefined
                trace(this.b); //2
        }
        localFunc(); // вызов локальной функции, иначе this ничего не будет возвращать
        //this.met = localFunc;
}
//Class1();
var obj = new Class1("аргумент функции внешней");
//c.met();
/*Выводит:
[object Object] //this
[type Object] //this
undefined
аргумент функции внешней //this.arguments
2 //this.b
*/

Ну и также такой пример можно привести:
Код:

function func(){
        trace(this);
}
func();//_level0
obj = new func();//[object Object]

2 wvxvw:
Цитата:

Что касается нашего спора: я могу согласится называть локальную функцию методом, но я всего 1 человек имеющий мало веса в огромнейшем программерском сообществе...
Никто не называет локальную функцию - методом, хватит извращатся wvxvw.
Я называю локальную функцию в prototype-based OOP AS1 - приватным методом. Разницу чувствуете?

wvxvw 30.06.2008 21:24

>> Вы хотите вызвать приватный метод вне тела класса? Помилуйте, но это не возможно. Ни вне тела класса, ни на этапе исполнения...

Да, я хочу вызвать приватный метод и увидеть как компайлер, ну или на худой конец дебаггер расскажет мне об ошибке =)
Это логичное и ожидаемое поведение приватного метода. Т.е. метод есть? - да есть. Вызвать можно? - нет, нельзя.

А то получается, я взял ваш класс, а то, как вы форматируете код противоречит моим религиозным принципам и смотреть в него я не хочу :) . АПИ к вашим классам нету... и вот мне приходит в голову... а не создать ли мне публичный метод у вот этого класса - и кто мне скажет нет? Вполне легитимное желание =) Но, в зависимости от того, как вы реализовали ваш псевдо-приватный метод, мой вновь созданый либо его уничтожит, либо сам не будет работать - что приведет меня в глубокое замешательсво, и мне прийдется наплевав на религиозные принципы взять и переписать ваш класс =)

От вас не требовался "prototype-based OOP AS1 - приватным метод". Нужен просто ООП приватный метод, без довесок в виде prototype-based =)

ЗЫ. на протяжении этой дискусии я не извращался (хотя, правды ради, готов признать, что иногда я это делаю :D ) С самого моего первого поста я последовательно, ни разу не отказываясь провожу одну и ту же мысль, просто с каждым разом освещая другие ее аспекты, которые, возможно, были упущены из виду другими дискутантами.
Мое убеждение остается таким же, каким и было: в АС1 приватных методов не существует, но существуют определенные воркараунды позволяющие добиться сходной функциональности, вместе с тем, каждый воркараунд имеет свои недостатки, справится с которыми не представляется возможным в силу отсутствия необходимого инструментария.

Да, и еще, вы путаете arguments.callee и arguments.caller. Но эти ссылки могут указывать на один и тот же объект только в случае рекурсивного вызова функции. Во всех остальных случаях callee (дословно "вызываемый") указывает на текущую функцию, а caller (дословно "вызывающий") указывает на функцию, которая текущую функцию вызвала. И обе эти ссылки только случайно могут совпасть с this текущей функции т.как прямо с этим не связаны.

riden 30.06.2008 22:04

Цитата:

в АС1 приватных методов не существуют, но существуют определенные воркараунды позволяющие добиться сходной функциональности, вместе с тем, каждый воркараунд имеет свои недостатки, справится с которыми не представляется возможным в силу отсутствия необходимого инструментария.
Спор не о чем... Я говорю о реализации приват и паблик, так как здесь в начале утверждали, что в AS1 - все паблик, нет инкапсуляции, что локальные функции по функциональности в ас1 чем-то отличаются: не могут обращатся к свойствам класса или изменять их, или еще - сама локальная функция не может использоватся в методах... - все это я опроверг.
К тому же представления о ООП в AS1 здесь оказались не четкими... Ведь Функция AS1 - играет роль класса, и тела класса.
Вы же по прежнему сравниваете два ООП, я этого не делал. Пост - #333

Цитата:

Да, и еще, вы путаете ...
Ничего не путаю, я пишу о том что такое объект активации функции, и что к нему не имеет отношение arguments.callee (ну и caller).

Цитата:

Да, я хочу вызвать приватный метод и увидеть как компайлер ...
Это то же можно реализовать, только это будет делать не компилятор, а вы, или сам класс, можно создать специальный метод.
Цитата:

А то получается, я взял ваш класс, а то, как вы форматируете код противоречит моим религиозным принципам и смотреть в него я не хочу . АПИ к вашим классам нету... и вот мне приходит в голову...
Тоже не вопос для AS1.

Заметьте принципиальную разницу, я говорю только об AS1, не сравниваю языки. Свою позицию относительно AS3 я уже выразил в посте #333. То есть вы мне пытаететсь доказать то, что я и так знаю. Все это не ко мне...
При попытках сравнивать языки, ООП, вопросов типо "AS3 оопэшнее, лчше, правильней...", и пр. возвращайтесь к посту 333 и читайте, читайте, читайте...

wvxvw 30.06.2008 22:14

Вот, на мой взгляд более приемлимий вариант приватного метода. Но все же у него есть 2 недостатка:
- в конструкторе его нельзя вызвать как this.privateMethod();
- из-за того, что вотчить _global невозможно, нельзя запретить переписать весь класс вместе с методом.
Код:

function TClass () {
        this.protectPrivate = function(prop, nVal, oVal) {
                throw new Error ("Method is private!");
        }
        this.privateMethod = function() {
                var flag = true;
                for (var i in this) {
                        if (arguments.caller == this[i]) flag = false;
                }
                trace(flag);
                TClass.prototype.watch("privateMethod", this.protectPrivate);
                this.watch("privateMethod", this.protectPrivate);
                if (flag) throw new Error ("Method is private!");
                trace ("private method accessed");
        }
        this.publicMethod = function() {
                this.privateMethod();
        }
        this.toString = function() {
                return "[TClass]";
        }
        privateMethod();
}
var t = new TClass();
t.publicMethod();
/*t.privateMethod(); // can not access uncomment to see it working
TClass.prototype.privateMethod = function() {
        trace("private method overrided"); // can not reassign
}
t.privateMethod = function() { // can not reassign in instances
        trace("instances behavior changed");
}*/


wvxvw 30.06.2008 22:19

>> Ничего не путаю, я пишу о том что такое объект активации функции, и что к нему не имеет отношение arguments.callee (ну и caller).

В посте #381 вы их перепутали, вам говорили про caller, а вы ответили про callee.

>> Это то же можно реализовать, только это будет делать не компилятор, а вы, или сам класс, можно создать специальный метод.

Именно это и будет значить, что в языке такой конструкции нет. Точно так же, как нет полной поддержки матричной трансформации - и тем не менее 3д движков хватает.

Я не сравниваю языки, я сравниваю 1 язык АС1 с эталоном. В этом и заключается суть нашей дискуссии.

Какую роль играет функция в АС1 - не имеет отношения к сути вопроса. Мы сравниваем конструкцию типа "класс" с эталоном описаным средствами не зависящими от реализации в любом конкретном языке.

BlooDHounD 30.06.2008 22:21

riden, повторю за остальным, возможно слегка понятнее:
this - пространство относительно которого вызывается функция (никаким образом не связано с "объектом активации функции").
arguments.caller - функция, которая вызвала текущую (вот пространство данной функции и будет "объектом активации функции").
arguments.callee - текущая функция (обычно используется для того, что бы хоть как-то поймать анонимную функцию).

Яски 30.06.2008 22:24

riden, вы уже давно ведетесь на уловки etc и пытаетесь переписать АС3 на АС1. С таким же успехом я могу доказать, что АС3 не ООП язык хотя бы потому, что в нем нет inline методов. Я перешел на АС3 совсем недавно и мне совсем не интересно изучать старую технологию. Но положение дел в этой теме меня совсем не устраивает, и я попытаюсь сам доказать, что АС1 - ООП язык. АС1 использует частный случай ООП - Прототипное_программирование. Так или иначе ООП предусматривает три основных парадигмы, рассмотрим каждую из них:
1) Инкапсуляция - способ скрыть внутреннее исполнение от внешней обертки
Код:

function Base(){
        var text = function(){
                return 'private text'
        };
        this.method = function(){
                return text() + ' returned from public'
        };
};

var obj = new Base();

trace(obj.text()) // "undefined"
trace(obj.method()) // "private text returned from public"

2) Наследование - наследованный класс, использует код базового класса, добавив свою функциональность.
Код:

function Extends() {
        var base = new Base();
        this.method = base.method;
        this.method2 = function() {
                return "added method to base class";
        };
};

var obj2 = new Extends();

trace(obj2.text()) // "undefined"
trace(obj2.method()) // "private text returned from public"
trace(obj2.method2()) // "added method to base class"

3) Полиморфизм - наследованный класс переопределяет функиональность базового класса.
Код:

function Extends2() {
        var base = new Base();
        this.method = function() {
                return "this is " + base.method() + " of base class? No this overriden method off base class";
        };
};

var obj = new Base();
var obj2 = new Extends2();

trace(obj2.text()) // "undefined"
trace(obj2.method()) // "this is private text returned from public of base class? No this overriden method off base class
"

И чем проще код, тем сложнее допустить ошибку.

BlooDHounD 30.06.2008 23:01

Яски, а где в ООП написано, что должны быть inline методы? Вы кажется путаете тёплое с мягким :)

riden 30.06.2008 23:19

Цитата:

Сообщение от BlooDHounD (Сообщение 749062)
riden, повторю за остальным, возможно слегка понятнее:
this - пространство относительно которого вызывается функция (никаким образом не связано с "объектом активации функции").
arguments.caller - функция, которая вызвала текущую (вот пространство данной функции и будет "объектом активации функции").
arguments.callee - текущая функция (обычно используется для того, что бы хоть как-то поймать анонимную функцию).

this - указатель на объект активации функции. callee, caller - ссылаются на функции.
Код:

function Class1(a){
this.a=a;
        trace (this); //[object Object] //указатель на obj - экземпляр класса Class1
        function localFunc(){
                this.b=2;
                trace(this); //[type Object] - объект активации функции
                trace(arguments.caller); //[type Function] //- разница налицо
                trace(this.arguments);//аргумент функции внешней
                                                        //это подтверждает что объект активации - внешняя функция (Class1)
                trace(arguments.caller.arguments); //undefined //!
                trace(this.a); //undefined
                trace(this.b); //2
        }
        localFunc();
        //this.met = localFunc;
}
//Class1();
var obj = new Class1("аргумент функции внешней");

Код:

function func(){
        trace(this);
        trace(arguments.caller); //null //- :)
}
func();//_level0  //- объект активации
obj = new func();//[object Object] //- объект активации

Можете экземпляр класса (функции) obj называть "пространством вызова функции", но это объект, _level0 - тоже объект, и функция ([type Object]) - тоже объект.

BlooDHounD 01.07.2008 00:35

riden, бугого. я пошёл отсюда пока мне нилс плюс не влепил.
P.S.: вам надо либо изучить парочку толковых словарей (пример: http://slovari.yandex.ru/dict/ushakov ), либо написать свой. ибо как я понял Вас тут все не понимают :)


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

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