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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.06.2008, 21:09
riden вне форума Посмотреть профиль Отправить личное сообщение для riden Найти все сообщения от riden
  № 381  
Ответить с цитированием
riden
 
Аватар для riden

Регистрация: 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
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 - приватным методом. Разницу чувствуете?
__________________
видеоигры - высший вид искусства


Последний раз редактировалось riden; 30.06.2008 в 21:17.
Старый 30.06.2008, 21:24
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 382  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
>> Вы хотите вызвать приватный метод вне тела класса? Помилуйте, но это не возможно. Ни вне тела класса, ни на этапе исполнения...

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

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

От вас не требовался "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.
Старый 30.06.2008, 22:04
riden вне форума Посмотреть профиль Отправить личное сообщение для riden Найти все сообщения от riden
  № 383  
Ответить с цитированием
riden
 
Аватар для riden

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

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

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

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


Последний раз редактировалось riden; 30.06.2008 в 22:06.
Старый 30.06.2008, 22:14
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 384  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Вот, на мой взгляд более приемлимий вариант приватного метода. Но все же у него есть 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

Старый 30.06.2008, 22:19
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 385  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
>> Ничего не путаю, я пишу о том что такое объект активации функции, и что к нему не имеет отношение arguments.callee (ну и caller).

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

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

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

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

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


Последний раз редактировалось wvxvw; 30.06.2008 в 22:24.
Старый 30.06.2008, 22:21
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 386  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

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

Старый 30.06.2008, 22:24
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 387  
Ответить с цитированием
Яски

блогер
Регистрация: 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"
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
"
И чем проще код, тем сложнее допустить ошибку.


Последний раз редактировалось Яски; 30.06.2008 в 22:28.
Старый 30.06.2008, 23:01
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 388  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
Яски, а где в ООП написано, что должны быть inline методы? Вы кажется путаете тёплое с мягким

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

Регистрация: Jun 2005
Сообщений: 147
Цитата:
Сообщение от BlooDHounD Посмотреть сообщение
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]) - тоже объект.
__________________
видеоигры - высший вид искусства


Последний раз редактировалось riden; 01.07.2008 в 04:34. Причина: back to original
Старый 01.07.2008, 00:35
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 390  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
riden, бугого. я пошёл отсюда пока мне нилс плюс не влепил.
P.S.: вам надо либо изучить парочку толковых словарей (пример: http://slovari.yandex.ru/dict/ushakov ), либо написать свой. ибо как я понял Вас тут все не понимают

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

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

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


 


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


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