![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jun 2005
Сообщений: 147
|
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
Цитата:
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
*/
2 wvxvw: Цитата:
Я называю локальную функцию в prototype-based OOP AS1 - приватным методом. Разницу чувствуете?
__________________
видеоигры - высший вид искусства Последний раз редактировалось riden; 30.06.2008 в 21:17. |
|
|||||
|
Modus ponens
|
>> Вы хотите вызвать приватный метод вне тела класса? Помилуйте, но это не возможно. Ни вне тела класса, ни на этапе исполнения...
Да, я хочу вызвать приватный метод и увидеть как компайлер, ну или на худой конец дебаггер расскажет мне об ошибке =) Это логичное и ожидаемое поведение приватного метода. Т.е. метод есть? - да есть. Вызвать можно? - нет, нельзя. А то получается, я взял ваш класс, а то, как вы форматируете код противоречит моим религиозным принципам и смотреть в него я не хочу . АПИ к вашим классам нету... и вот мне приходит в голову... а не создать ли мне публичный метод у вот этого класса - и кто мне скажет нет? Вполне легитимное желание =) Но, в зависимости от того, как вы реализовали ваш псевдо-приватный метод, мой вновь созданый либо его уничтожит, либо сам не будет работать - что приведет меня в глубокое замешательсво, и мне прийдется наплевав на религиозные принципы взять и переписать ваш класс =)От вас не требовался "prototype-based OOP AS1 - приватным метод". Нужен просто ООП приватный метод, без довесок в виде prototype-based =) ЗЫ. на протяжении этой дискусии я не извращался (хотя, правды ради, готов признать, что иногда я это делаю ) С самого моего первого поста я последовательно, ни разу не отказываясь провожу одну и ту же мысль, просто с каждым разом освещая другие ее аспекты, которые, возможно, были упущены из виду другими дискутантами.Мое убеждение остается таким же, каким и было: в АС1 приватных методов не существует, но существуют определенные воркараунды позволяющие добиться сходной функциональности, вместе с тем, каждый воркараунд имеет свои недостатки, справится с которыми не представляется возможным в силу отсутствия необходимого инструментария. Да, и еще, вы путаете arguments.callee и arguments.caller. Но эти ссылки могут указывать на один и тот же объект только в случае рекурсивного вызова функции. Во всех остальных случаях callee (дословно "вызываемый") указывает на текущую функцию, а caller (дословно "вызывающий") указывает на функцию, которая текущую функцию вызвала. И обе эти ссылки только случайно могут совпасть с this текущей функции т.как прямо с этим не связаны.
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 30.06.2008 в 21:46. |
|
|||||
|
Регистрация: Jun 2005
Сообщений: 147
|
Цитата:
К тому же представления о ООП в AS1 здесь оказались не четкими... Ведь Функция AS1 - играет роль класса, и тела класса. Вы же по прежнему сравниваете два ООП, я этого не делал. Пост - #333 Цитата:
Цитата:
Цитата:
Заметьте принципиальную разницу, я говорю только об AS1, не сравниваю языки. Свою позицию относительно AS3 я уже выразил в посте #333. То есть вы мне пытаететсь доказать то, что я и так знаю. Все это не ко мне... При попытках сравнивать языки, ООП, вопросов типо "AS3 оопэшнее, лчше, правильней...", и пр. возвращайтесь к посту 333 и читайте, читайте, читайте...
__________________
видеоигры - высший вид искусства Последний раз редактировалось riden; 30.06.2008 в 22:06. |
|
|||||
|
Modus ponens
|
Вот, на мой взгляд более приемлимий вариант приватного метода. Но все же у него есть 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");
}*/
__________________
Hell is the possibility of sanity |
|
|||||
|
Modus ponens
|
>> Ничего не путаю, я пишу о том что такое объект активации функции, и что к нему не имеет отношение arguments.callee (ну и caller).
В посте #381 вы их перепутали, вам говорили про caller, а вы ответили про callee. >> Это то же можно реализовать, только это будет делать не компилятор, а вы, или сам класс, можно создать специальный метод. Именно это и будет значить, что в языке такой конструкции нет. Точно так же, как нет полной поддержки матричной трансформации - и тем не менее 3д движков хватает. Я не сравниваю языки, я сравниваю 1 язык АС1 с эталоном. В этом и заключается суть нашей дискуссии. Какую роль играет функция в АС1 - не имеет отношения к сути вопроса. Мы сравниваем конструкцию типа "класс" с эталоном описаным средствами не зависящими от реализации в любом конкретном языке.
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 30.06.2008 в 22:24. |
|
|||||
|
стервочка (я мужик)
|
riden, повторю за остальным, возможно слегка понятнее:
this - пространство относительно которого вызывается функция (никаким образом не связано с "объектом активации функции"). arguments.caller - функция, которая вызвала текущую (вот пространство данной функции и будет "объектом активации функции"). arguments.callee - текущая функция (обычно используется для того, что бы хоть как-то поймать анонимную функцию). |
|
|||||
|
блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
|
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"
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"
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
"
Последний раз редактировалось Яски; 30.06.2008 в 22:28. |
|
|||||
|
стервочка (я мужик)
|
Яски, а где в ООП написано, что должны быть inline методы? Вы кажется путаете тёплое с мягким
![]() |
|
|||||
|
Регистрация: Jun 2005
Сообщений: 147
|
Цитата:
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("аргумент функции внешней");
__________________
видеоигры - высший вид искусства Последний раз редактировалось riden; 01.07.2008 в 04:34. Причина: back to original |
|
|||||
|
стервочка (я мужик)
|
riden, бугого. я пошёл отсюда пока мне нилс плюс не влепил.
P.S.: вам надо либо изучить парочку толковых словарей (пример: http://slovari.yandex.ru/dict/ushakov ), либо написать свой. ибо как я понял Вас тут все не понимают ![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:10. |
|
|
« Предыдущая тема | Следующая тема » |
|
|