Форум 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 12:33

Цитата:

Сообщение от riden (Сообщение 748586)
Да что не понятно... Локальная переменная - это и есть приват-свойство.

И как вы эту «приватную» переменную будете использовать в других методах? И с чего вы взяли, что переменная, объявленная вне «конструктора» вашего чудо-класса на AS1 будет приватной?

riden 29.06.2008 14:44

Цитата:

И как вы эту «приватную» переменную будете использовать в других методах?
pvar2 используется "в других методах".

Код:

var pvar1:String; pvar1 = "bla-bla";//приватное свойство
var e:Boolean; e=true;
var g:Number;g=4;

//конструктор класса
function Class1(a, b){
var pvar2:Number; pvar2 =1;//приватное свойство
function pMet(){}//приватный метод
function pmet1(){
// pvar2 доступна в паблик методе
}

this.a = a;//паблик свойство
this.b = b;//паблик свойство
this.e = e;//паблик свойство

this.met1=pmet1;//паблик метод, свойство по значению
this.met2=pmet2; //паблик метод, свойство по ссылке
Class1.prototype.met3 = pmet1;// создание метода через прототип, внутри тела класса
}
function pmet2(){
// если нужна функция вне конструктора...
// хотя она уже не будет копироватся вместе с объектом (новым экземпляром), на нее будут ссылатся свойства класса.
//доступно приват свойство pvar1
}
Class1.f="static prop" // статическое свойство
Class1.prototype.g=g; // свойство по ссылке, наследуется подклассами

Цитата:

И с чего вы взяли, что переменная, объявленная вне «конструктора» вашего чудо-класса на AS1 будет приватной?
pvar1 - для функций вне "тела класса". Она приватная для класса Class1. Но ведь не обязательно функцию вне класса писать (а значит и переменные). Ведь в AS1 - функция - это и есть объект активации, играет роль и конструктора и тела класса. Так что не вижу противоречий.
Код:

var ob = new Class1(2,3);
///traces
trace(ob.a);//2
trace(ob.e);//true
trace(ob.pvar2);//undefined - нет такого свойства у класса
trace(ob.pvar1); //undefined - нет такого паблик свойства
trace(ob.met3); //[type Function] - паблик метод: свойство созданное в прототипе,
                      //в теле класса и ссылающееся на локальную функцию


iNils 29.06.2008 14:50

riden, что за ерунду вы написали?

etc 29.06.2008 15:09

riden, ваше pvar1 и не принадлежит классу вовсе, это внешняя переменная и уж точно не приватная. И с какого перепугу у вас метод вдруг стал приватным, когда вы его потом пабликом делаете?

riden 29.06.2008 15:11

2 iNinls
Не ерунда. pvar2 (посмотрите в коде) - будет "приватным свойством" в смысле AS3 (то есть свойство которое видно, только в теле класса и не видно вне класса). В AS2 private = protected AS3.
2 __etc
Не принадлежит, но доступно ее использование в теле класса. Ладно, забили на pvar1, смотрте на pvar2.

Цитата:

с какого перепугу у вас метод вдруг стал приватным, когда вы его потом пабликом делаете
С того, что любая локальная функция пока не будет присвоено свойству класса в AS1 не сможет стать методом (то есть паблик). Где стал приватным? Это разные методы
Код:

function pMet(){}//приватный метод
function pmet1(){
// pvar2 доступна в паблик методе
}
this.met1=pmet1;//паблик метод, свойство по значению


iNils 29.06.2008 15:26

Цитата:

Сообщение от riden (Сообщение 748616)
Не ерунда. pvar2 (посмотрите в коде)

Я не буду смотреть, после моего сообщения вы уже 7 раз отредактировали текст своего :D

etc 29.06.2008 15:26

Цитата:

Сообщение от riden (Сообщение 748616)
В AS2 private = protected AS3.

Обычный public.

Цитата:

Сообщение от riden (Сообщение 748616)
Ладно, забили на pvar1, смотрте на pvar2.

Это единственное, что более менее попадает под понятие приватности. Только она тоже не принадлежит вашему экземпляру.

Цитата:

Сообщение от riden (Сообщение 748616)
С того, что любая локальная функция пока не будет присвоено свойству класса в AS1 не сможет стать методом (то есть паблик).

А работать с ней как тогда? Нет, конечно, есть шаманства с call и apply в своей области видимости, но опять же, такой метод не принадлежит вообще никому.
А ваш met1 — обычная ссылка на ваш «приватный» метод, вызвать по этой ссылке ваш метод может кто угодно и откуда угодно.

И перестаньте редактировать по 10 раз посты, сначала вы одно пишете, потом другое.

riden 29.06.2008 15:28

2 iNils
Код я практически не редоктировал. Надо было внимательно смотреть. Там две "приватные" переменные, так что смысл с самого начала сохранялся.

riden 29.06.2008 15:33

2 __etc
Цитата:

Это единственное, что более менее попадает под понятие приватности. Только она тоже не принадлежит вашему экземпляру.
А зачем он должен принадлежать экземпляру? (Кстати как вы это узнали? поверю вам на слово). Когда вы создадите экземпляр, то в другом теле класса будут доступны только паблик.

Цитата:

А работать с ней как тогда?
Так же как и с приватным методом в теле класса (напомню, тело функции == тело класса в АС3, функция внутри функции == приватная функция АС3)

etc 29.06.2008 15:40

Цитата:

Сообщение от riden (Сообщение 748622)
А зачем он должен принадлежать экземпляру? (Кстати как вы это узнали? поверю вам на слово).

Я не могу написать this.pvar1.

Цитата:

Сообщение от riden (Сообщение 748622)
Так же как и с приватным методом в теле класса (напомню, тело функции == тело класса в АС3, функция внутри функции == приватная функция АС3)

Ага, только вам придется для вызова этого метода воспользоваться call или apply, чтобы не светить вашим «приватным» методом наружу. Очень технологично.

А главное, непонятно, все ваши извращения автоматически реализует компилятор в AS2, но вы уперлись и использовать его не хотите…


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

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