Вопрос: вот есть AS3, он же вроде причёсанный Adobe'ом форк JS, а в основе JS лежит концепция prototype(а это клёвая штука! :)), а куда она делась в AS3? [Тут надо заметить, что AS2\1 я вообще знать не знаю и в глаза не видел].
Потом у меня образовался непредвиденный отпуск, и я от нечего делать начал ковыряться с Burrito-Hero-Android-iPhone и другими новоявленными интересностями во флеше.
Пишу я значит аппликуху, пишу, и тут натыкаюсь на задачу: хочется мне расширить класс Array нужным мне методом.
ООП-way: "наследуйся!".
JS-way:
Array.prototype.newMethod =
function() {blah-blah};
Вспоминаю свой Вопрос, гуглю - оказывается никуда ничего не делось, всё на месте, но нужно учитывать специфику. [А в AS2/1 так вообще, оказывается, прототипирование пышны м цветом цвело.]
Почитал, порадовался. Но. Adob'овцы настоятельно не советуют. Мол ООП наше всё и нефиг искать лёгких путей. Кроме того куча ограничений портящих всю малину. Более менее удобно prototype использовать для динамических классов:
var arr:Array = [1,2,3];удобно?
arr.checksumm();
или сразу [1,2,3].checksumm();
Для не динамических классов, чтобы прорваться через компилятор приходится разыменовываться к Object, что уже съедает весь профит. Хотя нетипизированные переменные частично решают проблему:
var a = 5;красиво?
a.minutes().ago(); // вернёт время(Date) на a минут меньшее, чем
now
А вот вариант когда использование prototype может быть реально полезно:
возвращаемся к нашему Array, которому хочется добавить метод. Не выёживаемся и идём ООП путём. А теперь начинаем оптимизировать, и приходим к выводу что надо бы вместо Array сделать Vector.<int> и сильно огорчаемся, узнав что от Vector.<*> отнаследоваться никак нельзя, final класс, все дела. Можно мутить врапперы-хелперы, а можно воткнуть метод через prototype и использовать так:
var b:Vector.<int> = new Vector.<int>();профит!
b.push(1,2,3);
trace(Object(b).sum()); // =6!
Если кому интересно могу опубликовать здесь исходники, но вообще тут довольно внятно всё объясняется.
3 комментария:
1. as никогда не был форком js
2. в js-мире большинство js-разработчиков скрутят вам яйца в дудочку и заставят на ней сыграть за то, что изменяете прототипы buuldin классов.
1. Спорить не буду, прямых посылок что AS3 как-то соотносится с JS у меня нету. Но почему-то такое ощущение возникло . Наверное ошибочно.
2. Попробую поспорить :) Тут мы видим (есть там удобные ссылочки на сорцы)поширенные массивы, строки и т.д. Может быть ExtJS это анархисты в мире JS :) Но подобные приёмы я видел во многих фреймворках, которые, по моему мнению, достаточно популярны.
В любом случае за комментарий спасибо.
Tamarin – это попытка интеграции AS3 в FireFox и отношения к JavaScript не имеет. Оба языка основаны на разных спецификациях ECMAScript и других связей, кроме ECMA не имеют.
Отправить комментарий