![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Jun 2005
Сообщений: 147
|
Цитата:
Ну так... ты не то что не смог обратистя к приватному методу - возвращает undefined, я вообще не понимаю на что ты расчитывал, применяя указатель this внутри локальной функции без объекта активации (то есть ни создан ее экземпляр функции, ни вызов функции в теле класса, что бы образовалось "область видимости" и появилась ссылка на указатель) - если бы ты это сделал, ты бы получил this, но так как у объекта активации(объект-экземпляр этой функции или сама функция) нет свойства pMetA, то все равно бы было undefined. На pMet - ничего не ссылается, как ты собираешся к ней доступ получить? К чему эти танцы с бубном? Выше приведенная тобой функция может получить ссылку на this класса (а не функции, как у тебя)... И что дальше? Ты сможешь обратится к свойствам класса (то есть паблик), а все что не свойства класса, а находится внутри - приват. Короче - не связный бред... не в тему. Далее... Цитата:
Вернемся же к теме (облегченный вариант): 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
__________________
видеоигры - высший вид искусства Последний раз редактировалось riden; 30.06.2008 в 05:41. |
|
|||||
|
Регистрация: Jun 2005
Сообщений: 147
|
2 wvxvw:
Цитата:
Цитата:
Если вы подразумеваете под областью видимости вызов this из функции - то я вам уже десять раз говорил, что означает this, и что есть функция в AS1. Область видимости - это доступность свойст из метода, а не то что вы пишите. Вызвав this данной функции - вы получите ссылку на объект активации этой функции. Ну и что, что в AS3 подругому. AS3 - полностью ООП-й язык. В AS3 функции имеют более узкое назначение и применение.. О чем речь? Цитата:
Если ты говоришь про что то другое, то я тебе уже приводил пример, как метод в прототипе (но не созданный динамично) получает доступ к приват свойствам. Цитата:
Последний раз редактировалось riden; 30.06.2008 в 06:53. |
|
|||||
|
Modus ponens
|
>> Сколько тебе раз еще говорить про this? this - это указатель на объект активации.
курим мануал. ответ простой: нет. указатель на объект активации - argumetns.caller >> Ну так... ты не то что не смог обратистя к приватному методу - возвращает undefined, я вообще не понимаю на что ты расчитывал рассчитывал получить undefined. получил то, на что рассчитывал. Т.е. функция не является методом, пому, что другой метод не смог получить к ней доступ >> Функция локальная может видеть глобальные свойства. мне не не интересны в данном контексте глобальные свойства, мне нужны только свойства объекта, чьим методом эта функция должна быть. Опять же, она их не видит. >> В AS3 функции имеют более узкое назначение и применение ложь =) >> Методы обяъявленные позже. Тоесть динамические - так? Не вижу никакой связи с временем объявлении метода и тем будет ли он статическим или динамическим. >> Ну и почему методы созданные на этапе исполнения(то есть когда создаются экземпляры классов) (пускай даже на временной диаграме) должны иметь доступ к приват-свойствам класса? Это является обязательным атрибутом метода, иначе это не метод. >> вне тела класса. Вы путаете конструктор класса и сам класс. >>> Функцию объявленную таким образом можно вызвать с разными областями >>>видимости используя call и apply. >> Вызовите приват метод из тела другого класса.... Где в моем утверждении сказано, что можно вызвать из другого класса? Я говорю, что ее можно вызвать, например, из конструктора класса, но при этом определить ее область видимости не такой, какая должна быть у метода. ЗЫ. То как я понимаю метод и приватный метод я описал в "тезисах" в предыдущем сообщении. Если вы считаете, что моя отправная точка не верная - тогда продолжать дискуссию не имеет смысла т.как дискуссия не может быть продуктивной если тезисы дискутирующих противоречивы.
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 30.06.2008 в 13:50. |
|
|||||
|
.grin! wuz here
|
var x = new(function z(){
var private = 'private';
this.public = 'public';
this.meth = function(){
return [private, this.public];
}
})()
alert(x.private) // undefined
alert(x.public) // "public"
alert(x.meth()) // "private, public"
x.private = '123';
alert(x.meth()) // "private, public"
Цитата:
Цитата:
__________________
Breakcore them all! |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
![]() |
|
|||||
|
блогер
Регистрация: 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. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Яски, я прошу написать не по отдельности все принципы ООП, а все вместе, пример на AS3 я привел. Истинно объектно-ориентированным языком можно назвать тот язык, который позволяет на уровне языка реализовать три принципа ООП сразу вместе на парочке классов, а не по отдельности, причем, реализованных средствами самого языка, а не руками, как тут уже всю тему пытаются сделать.
В AS1 у вас этого не получится, подобную приватность не скрестить с наследованием, а полиморфизма в AS1 вообще нет ни в каком виде. AS1 вам позволяет думать в стиле ООП, но не дает вам средств работы с ним. Т. е. вы сами реализовываете наследование (ручками), сами реализовываете приватность (либо на уровне договоренности с самим собой, что некоторые методы извне вызывать нельзя), а полиморфизм держите в голове. А посему, AS1 — псевдо-ООП язык, не является истинно объектно-ориентированным, как и JavaScript. Кстати, наследование реализуется не так, как вы написали, это вообще будет ручной труд по копированию методов от предка к наследнику. Для наследования у вас есть скрытые костыли языка в виде __proto__ и __constructor__. riden, то, что у вас каша в голове, созданная товарищем Гурским, наглядно показывает перепутанные caller, про который я спрашивал и callee. Возьмите, хотя бы, Essential ActionScript 2.0, все станет просто и понятно. И потом, если вы не заметили, приемлимый вариант приватности уже привели (хотя мой вариант мне гораздо больше нравится, чем у wxvxw, потому что у меня функция не видна снаружи вообще). Ваш объект активации, суть объект, в контексте которого вызывается функция, т. е. в его области видимости. При использовании кейворда new создается новая область видимости. В AS3 поведение иное, область видимости не изменяется, даже если присвоить ссылку на метод класса другому объекту. А в AS1/AS2 функция будет вызвана в области видимости того объекта, к которому она присвоена: o = new Object();
o.toString = function() {
return 'object o';
}
a = new Object();
a.toString = function() {
return 'object a';
}
function test() {
trace(this);
}
o.test = test;
a.test = test;
test(); // _level0
o.test(); // object o
a.test(); // object a
trace([test==o.test, test==a.test]); // true,true
Последний раз редактировалось etc; 01.07.2008 в 10:47. |
|
|||||
|
блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
|
Цитата:
Цитата:
![]() Цитата:
Цитата:
function IMyClass(){
this.getRotation = function(){
return 'abstract method'
};
};
function MyClass() {
this.__proto__ = IMyClass;
this.angle = 0;
var calculateValue = function () {
this.angle = 2*Math.PI*Math.random();
};
this.getRotation = function() {
calculateValue.call(this);
return this.angle/Math.PI*180;
};
};
function AnotherMyClass() {
this.__proto__ = MyClass;
this.getRotation = function() {
var rotation = this.__proto__.getRotation();
return rotation/2;
};
this.getRadians = function() {
return this.angle/2;
}
};
var iMyClass = new IMyClass();
var myClass = new myClass();
var aMyClass = new AnotherMyClass();
trace(iMyClass.calculateValue()) // "undefined"
trace(iMyClass.getRadians()) // "undefined"
trace(iMyClass.getRotation()) // "abstract method"
trace(iMyClass.angle) // "undefined"
trace(myClass.calculateValue()) // "undefined"
trace(myClass.getRadians()) // "undefined"
trace(myClass.getRotation()) // "152.942357249558"
trace(myClass.angle) // "2.66934769976621"
trace(aMyClass.calculateValue()) // "undefined"
trace(aMyClass.getRadians()) // "1.3346738498831"
trace(aMyClass.getRotation()) // "102.746495101601"
trace(aMyClass.angle) // "3.58652926881432"
Как я уже говорил АС1 и JavaScript являются прототипными ООП. Что свойственно для языков программирования без жесткой типизации, в которых нельзя ввести определение класса. Если ,etcs, хочет называть все прототипные языки программирования "неистенными" это его право, но только вместе с приставкой ООП. Последний раз редактировалось Яски; 01.07.2008 в 13:59. |
|
||||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
p.S. В моем нике всего три буквы и два подчеркивания, но почему в нём постоянно делают ошибки? То буквы местами перепутают, то «c» с «s», то одно подчеркивания вместо двух (хотя подчеркивания можно и опустить совсем). |
|
||||||
|
Регистрация: Jun 2005
Сообщений: 147
|
Цитата:
В остальном prototype может использоватся как ссылка, для того что бы НА ЭТАПЕ ИСПОЛНЕНИЯ СОЗДАТЬ НОВОЕ СВОЙСТВО (так и делает wvxvw) Не вижу ни какой сязи с prototype и созданием свойств (методов) вне конструктора (тела класса). Я уже приводил код, как это делается в теле класса. 2Ромастый... если вы не видели мой код, создание свойств и методов делается так в АС1, в теле класса: var бла бла // приват свойство
функция(){одна одинешенька, на меня никто не ссилается} //приват метод
this.свойство = бла-бла // паблик свойство
this.свойство = функция //паблик метод
Цитата:
Цитата:
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 вызванное из функции без объекта активации, возвращает undefined. Вы применяете обман, и утверждаете что функция не видит "выше" (выше-вложенной функции, то есть функции-тела ласса). Так то что функция все видит, убедится очень легко... процитирую свой код... ......................
var pa = this;//ссылка
//приват метод изменяте паблик свойство
function pMetA(){pa.a=10;}
..................
Цитата:
![]() Цитата:
![]() Или у вас такой малый опыт програмирования, или что.. не знаю, что вы не можете провести аналогии между AS1 и AS3... Или на временной диаграме вы это зделаете, или в теле другого класса, к приват вы уже не имеете никакого отношения... Или вы напрочь забыли для чего приват свойста? Функция в AS1, которая имеет объект активации в виде объекта инициализированного оператором new, и есть класс, так как с этого момента (new) this данной функции будет ссылатся на объект активации, на каждый экземпляр и заполнять пустой объект свойствами this."свойство". Вот код, и апровержения я так и не увидел. Приватный метод 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
![]() Последний раз редактировалось riden; 30.06.2008 в 15:20. |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:39. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|