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

etc 29.06.2008 19:48

Цитата:

Сообщение от riden (Сообщение 748668)
2 __etc

Код:

//конструктор класса
function Class1(a){
var pvar2:Number;//приватное свойство
this.a = a;//паблик свойство по значению
//приватный метод
function pMet(){
return Math.random()*a;
}
//паблик метод
function pmet1(){
return "Вот так я работаю "+pMet();
}

this.met1=pmet1;//паблик метод, свойство по значению
}

////////////////////////////////////////
var obj = new Class1(2);
trace(obj.met1()); //Вот так я работаю 0.312059603631496


То, что вы написали — использование локальной функции, это вовсе не метод. Поставьте трейc this внутри вашего метода и посмотрите, что он вам вернет.

Код:

//конструктор класса
function Class1(a){
var pvar2:Number;//приватное свойство
this.a = a;//паблик свойство по значению
//приватный метод
function pMet(){
        trace('я есть приватный метод класса '+this); // я есть приватный метод класса undefined
return Math.random()*a;
}
//паблик метод
function pmet1(){
return "Вот так я работаю "+pMet();
}

this.met1=pmet1;//паблик метод, свойство по значению
}

////////////////////////////////////////
var obj = new Class1(2);
trace(obj.met1()); //Вот так я работаю 0.312059603631496


wvxvw 29.06.2008 19:52

Цитата:

Сообщение от riden (Сообщение 748670)
2 wvxvw:
Вы трэйсите this не TClass, а toBePrivate. То есть вы хотите узнать видимость "внутри" toBePrivate? this - не для этого служит. Для чего он служит в AS1 я уже писал.

Если область видимости одинаковая у двух объектов - this у этих двух объектов обязан указывать на один и тот же объект - это азы понимания ОО. Вы спорите с аксиомами...

riden 29.06.2008 19:53

Цитата:

Сообщение от __etc
Поставьте трейc this внутри вашего метода и посмотрите, что он вам вернет

Да вы что все сговорились?
Еще раз... процетирую себя:
Цитата:

this - это указатель на объект активации. В вашем случае, такой объект - function toBePrivate. Ну и где вы создаете ее экземпляр? Не создаете?, тогда что вы хотите получить от this?
function toBePrivate замените на function pMet

etc 29.06.2008 19:57

Цитата:

Сообщение от riden (Сообщение 748674)
Да вы что все сговорились?
Еще раз... процетирую себя:

function toBePrivate замените на function pMet

Да что вы говорите? А в AS3 трейс this в приватном методе на кого ссылку выдает? Правильно, на экземпляр этого класса. А у вас вообще метод в анонимной области вызывается и совсем не принадлежит экземпляру. Т.е. опять же, это не приватный метод, а локальная функция, коей и была всю дорогу.

Если уж вы так не соглашаетесь относительно this, то расскажите (точнее, покажите) мне, каким образом я могу работать с публичными переменными данного класса внутри приватного метода pMet?

riden 29.06.2008 20:01

Цитата:

Сообщение от wvxvw (Сообщение 748673)
Если область видимости одинаковая у двух объектов - this у этих двух объектов обязан указывать на один и тот же объект - это азы понимания ОО. Вы спорите с аксиомами...

Азы? Где же вы такое прочитали?
АС3 я знаю, не надо мне про "Азы" говорить.
Что бы обратится к приватному свойству/методу в AS1 мне достаточно обратится к локальной переменной/функции.
В AS1 совершенно другое значение функции, более широкое. У каждой функции свой this. Так что, что вы мне свою пургу несете про "азы". Вы будите мне доказывать, что прототипное ООП - вовсе не ООП?
AS1 очень гибок это факт. А AS3 очень эффективен.

riden 29.06.2008 20:06

2 __etc
Цитата:

Если уж вы так не соглашаетесь относительно this, то расскажите (точнее, покажите) мне, каким образом я могу работать с публичными переменными данного класса внутри приватного метода pMet?
Хватит меня напрегать, если не знаете, полно литературы по АС1 :)

Как?
Код:

var pa;
this.a = 34;
pa = this.a;
function pMet(){
trace(a); // первый способ
trace(pa); // второй способ
}


etc 29.06.2008 20:18

Цитата:

Сообщение от riden (Сообщение 748678)
Хватит меня напрегать, если не знаете, полно литературы по АС1 :)

А, я уже вас напрягаю? Т. е. все-таки что-то не так? :quiet:
Давайте расставим все точки над i, не уходите от разговора:

Цитата:

Сообщение от riden (Сообщение 748678)
Как?
Код:

var pa;
this.a = 34;
pa = this.a;
function pMet(){
trace(a); // первый способ
trace(pa); // второй способ
}


Ага, как мне изменить значение публичной переменной «a» в приватном методе pMet? Мне же не просто надо смотреть на переменную, а ещё и изменять её.

wvxvw 29.06.2008 20:34

Цитата:

Да вы что все сговорились?
Вот именно :D все сговорились и решили называть функцию с той же областью видимости, что и объект, в котором она была создана, методом. А вы как-то пропустили этот момент =)
Т.е. посмотрите на это так:
существует класс Функция, он может быть использован, как метод другого класса, но не обязан. Метод обязан быть функцией. Из этого следует, что не все функции - методы, но все методы - функции.
То что вы создали не является методом, потому что не соответствует определению метода, но является функцией. Чтобы эта функция была методом она должна соответствовать следующим условиям:
- она должна быть доступна любому другому методу объекта, чьим методом она является. (Ваша функция этому требованию не соответствует, т.как методы объявленные на прототипе класса не смогут к ней обратиться).
- она должна быть в состоянии обратиться к любому другому методу класса, чьим методом она является. (Ваша функция не соответствует этому требованию, т.как любой метод / свойство объявленное после ее оъявления будут ей недоступны).

etc 29.06.2008 20:41

Цитата:

Сообщение от wvxvw (Сообщение 748681)
Вот именно :D все сговорились и решили называть функцию с той же областью видимости, что и объект, в котором она была создана, методом. А вы как-то пропустили этот момент =)
Т.е. посмотрите на это так:
существует класс Функция, он может быть использован, как метод другого класса, но не обязан. Метод обязан быть функцией. Из этого следует, что не все функции - методы, но все методы - функции.
То что вы создали не является методом, потому что не соответствует определению метода, но является функцией. Чтобы эта функция была методом она должна соответствовать следующим условиям:
- она должна быть доступна любому другому методу объекта, чьим методом она является. (Ваша функция этому требованию не соответствует, т.как методы объявленные на прототипе класса не смогут к ней обратиться).
- она должна быть в состоянии обратиться к любому другому методу класса, чьим методом она является. (Ваша функция не соответствует этому требованию, т.как любой метод / свойство объявленное после ее оъявления будут ей недоступны).

Я бы ещё добавил, что все методы должны объекта иметь ту же область видимости, что и сам объект.

riden 29.06.2008 20:52

Цитата:

Сообщение от wvxvw
Чтобы эта функция была методом она должна соответствовать следующим условиям:
- она должна быть доступна любому другому методу объекта, чьим методом она является. (Ваша функция этому требованию не соответствует, т.как методы объявленные на прототипе класса не смогут к ней обратиться).
- она должна быть в состоянии обратиться к любому другому методу класса, чьим методом она является. (Ваша функция не соответствует этому требованию, т.как любой метод / свойство объявленное после ее оъявления будут ей недоступны).

Код:

function Class1(){
var pat;
this.at=34;
pat = this.at;
//приватный метод
function pMetA(){
trace(pat); // использует паблик свойство по ссылке
}
//приватный метод
function pMetB(){
pmet2; //использует паблик метод объявленный "после", требование 2 исчерпано
}
//паблик методы
function pmet1(){
pMetA();
}
function pmet2(){
trace("do pmet2");
}

this.met1=pmet1;//паблик метод, свойство по значению
this.met2=pmet2; //паблик метод объявленный после
Class1.prototype.met3 = pmet1; // требование 1 исчерпано
}

////////////////////////////////////////
var obj = new Class1();
obj.met2(); //do pmet2
obj.met3(); //34

Добавлено в 18:59
2 __etc:
Цитата:

Ага, как мне изменить значение публичной переменной «a» в приватном методе pMet? Мне же не просто надо смотреть на переменную, а ещё и изменять её.
Используй prototype. Вы не программировали на AS1?


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

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