![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Modus ponens
|
>> wvxvw, придираетесь к терминологии. "при определнных обстоятельствах функция и метод не могут выполнять одну и ту же роль." пример плз.
function TClass (targetObj) {
function notMethod () {
trace (this);
}
notMethod.call(targetObj);
}
function AClass () {
this.toString = function () {
return ("[AClass]");
}
}
var t = new TClass(new AClass()); //[AClass]
ЗЫ. Терминология, особенно в том, что касается точных наук нужна для того, чтобы ей неукоснительно следовать. Иначе возникают разночтения, которые только препядствуют дальнейшему развитию. Для этого пишутся стандарты, создаются исследовательские группы... При этом примеры таких разночтений призваных к жизни исключительно ленью и халатностью разработчиков не удосужившихся заглянуть в госты/стандарты и т.п. литературу - сплошь и рядом. Да тот же ХТМЛ, который никогда ни в одной програме способной его воспринимать не был реализован согласно своим стандартам. Поэтому, лучше называть вещи своими именами - пусть лучше будет сложнее понять, но правильно, чем неверно истолковано. Что касается нашего спора: я могу согласится называть локальную функцию методом, но я всего 1 человек имеющий мало веса в огромнейшем программерском сообществе. В этом же сообществе существует масса литературы трактующей метод по-другому. Локально приняв соглашение об использовании ненормативной терминологии мы создадим прецедент, последствиями которого может стать кривая реализация другого абсолютно не связанного с нашим спором проэкта. Что в дальнейшем повлечет за собой лишние усложнения в технологии работающей с ним и т.д...
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 30.06.2008 в 17:34. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
|
|
|||||
|
Регистрация: Jun 2005
Сообщений: 147
|
Цитата:
function Class1(){
this.a=1;
trace (this); //[object Object]
function localFunc(){
this.b=2
trace(this);//this получает ссылку в момент создания экземпляра
//Выводит [type Object]
trace(this.a); //undefined
trace(this.b); //2
}
localFunc();
//this.met = localFunc;
}
//Class1();
var c = new Class1();
//c.met();
/*Выводит:
[object Object] - ссылка на объект с
[type Object] - ссылка на localFunc() (я так думаю)
undefined - нет такого свойства в объекте
2
*/
Цитата:
А если хотитие чтобы функция работала как метод, то надо сделать вот так: this.свойство = функция. Цитата:
Еще раз, почему функция в AS1 - это и конструктор и тело класса... Во первых, потому что: Цитата:
function func1(){}; // Создаем внешнюю функцию
func1.prop2=1; // Присваиваем функции свойство
function Class1(){ // Функция-класс
function func2(){}; // Создаем внутреннюю функцию
func2.prop=1; // Присваиваем внутренней функции свойство
this.method1=func1; // Создаем методы, ссылаясь на внутреннюю
this.method2=func2; // и внешнюю функции
}
var obj1=new Class1(); // Создаем два объекта класса Class
var obj2=new Class1();
obj1.method1.prop=2; // Переопределяем свойства функций методов
// одного из объектов
//obj1.method2.prop=2;
trace(obj2.method1.prop); // Выводит: 2 (свойство было изменено)
trace(obj2.method2.prop); // Выводит: 1 (свойство осталось неизменным)
__________________
видеоигры - высший вид искусства Последний раз редактировалось riden; 30.06.2008 в 20:00. |
|
|||||
|
Modus ponens
|
Цитата:
__________________
Hell is the possibility of sanity |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
Как была областью видимости, так ею и осталась. Одно дело думать, другое дело — знать. Вы создали свойство в анонимной области видимости, после этого приплетаете объект активации (arguments.caller, вы знаете, что это такое?), который вообще отношения к ней не имеет. Неправда. Локальная функция не принадлежит объекту, она сама может быть как объект. Приватный метод обязан принадлежать классу, который его реализует, а значит область видимости (this внутри этого метода) должен указывать на экземпляр этого класса. У вас этого не происходит и вы вынуждены создавать ссылки на экземпляр (т.е. ссылка на самого себя), чтобы иметь возможность работать с другими методами и свойствами экземляра. Но то, что у вас есть внешняя ссылка (а не внутренняя) на экземпляр, не делает эту функцию методом, принадлежащем экземпляру. Вам об этом талдычат уже пятую или шестую страницу подряд, но вы упорно этого не понимаете, начиная нести чушь про this и объекты активации, которые вообще отношения к делу не имеют. В чем я не прав? Вы до сих пор не организовали ваши чудо-приваты так, как следовало, хотя я и wxvxw несколько раз давали намек на реализацию. Т.к. я понял, что мне этого от вас не добиться и ваши приватные методы никогда не будут работать в области видимости экземпляра (уж это реализовать можно, хоть методы так и не будут принадлежать экземпляру, т.к. это невозможно из-за подобной «приватности»), я решил продолжить тему относительно того, является ли AS1 истинным объектно-ориентированным языком или нет. И прошу товарища индейца переписать мои классы на AS1, с учетом обязательной реализации приватности. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
Цитата:
|
|
|||||
|
Регистрация: Jun 2005
Сообщений: 147
|
2 Inils: поправил.
2 wvxvw: Цитата:
2 __etc: Это же вы пишите, что this имеет отношение к области видимости... я уже писал. Цитата:
Область видимости? - все переменные верхней функции видны.
__________________
видеоигры - высший вид искусства Последний раз редактировалось riden; 30.06.2008 в 20:33. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Господи, прекратите думать мыслями товарища Гурского, этот ваш объект активации настолько низкоуровневая вещь, что товарищ Гурский в начале параграфа заявил на двухсотой (!) странице, что пора прояснить «смутную общую картину языка» © (т.е. он пудрил мозги двести страниц), а в конце «какое из проявлений функции считать основным — ответить на этот вопрос очень и очень непросто» © (продолжаем дальше варить кашу). Т.е. он мало того, что сам толком не понял, о чем рассказывает, так ещё и запудривает мозги другим. Поэтому, пожалуйста, постарайтесь думать своей головой.
Ваш чудо-приватный метод с нормальным this, а не «объектом активации» из книжки Гурского будет выглядеть вот так: function MyClass() {
this.x = 10;
function privateMethod() {
trace('call privateMethod, i am: '+this);
this.x = 20;
}
this.publicMethod = function() {
trace('call publicMethod, i am: '+this);
privateMethod.call(this);
}
this.toString = function() {
return 'MyClass instance';
}
}
o = new MyClass();
trace('o is '+o);
trace('o.x before = '+o.x); // 10
o.publicMethod();
trace('o.x after = '+o.x); // 20;
trace('o.privateMethod = '+o.privateMethod); // undefined
|
![]() |
![]() |
Часовой пояс GMT +4, время: 01:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|