Prototype 1.6.0 RC1: Изменены Class и Event API, Hash переписан, пофикшены баги...

by Sam Stephenson | October 16th, 2007

Спустя 2 месяца после появления 1.6.0 RC0, в ответ на ваши запросы мы пофиксили несколько багов и произвели некоторые изменения в Class и Event API. Так же устранили давнишнюю путаницу в классе Hash. Эти изменения теперь доступны для скачки во втором релиз-кандидате, Prototype 1.6.0 RC1. Читайте далее чтобы узнать какие произошли изменения более детально, некоторые из которых, кстати, несовместимы с предыдущими версиями Prototype.

Изменения в Class API

Изменения в API классов, введеные в [7833], результат ответов, которые мы получили на 1.6.0_rc0, и многочисленных длительных дебатов. Наша задача заключалась в упрощении API, так же как и основании плацдарма для последующих изменений в будущих версиях Prototype.

Для этого мы убрали Class.extend и Class.mixin методы, усовершенствовали Class.create синтаксис, и поменяли способ добавления методов в существующие классы. API всё ещё обратно совместимо со всеми pre-1.6 версиями Prototype. Мы не меняли алгоритма работы наследования, и вы по прежнему можете получить доступ к методам superclass-а с помощью специального аргумента $super.

Самое большое изменения - это то что все классы (объекты, возвращаемые по Class.create(), не экземпляры этих классов) теперь имеют метод “addMethods.” Этот метод принимает один аргумент - объект, свойства и методы которого приобретут все экземпляры класса.

Например, в 1.6.0_rc0 вы бы писали:

var Foo = Class.create();
Class.extend(Foo, { /* instance methods */ });

Теперь надо писать:

var Foo = Class.create();
Foo.addMethods({ /* instance methods */ });

Как и в 1.6.0_rc0, вы можете добавлять инстансные методы прямо из Class.create:

var Foo = Class.create({ /* instance methods */ });

Стоит отметить, что неизменным с 1.6.0_rc0 остался способ наследования от суперкласса, вы можете вставить класс первым аргументом в Class.create (опционально можно далее определить инстансные методы):

var Bar = Class.create(Foo);
var Baz = Class.create(Foo, { /* instance methods */ });

Внутри Prototype вызовет метод addMethods созданного класса чтобы добавить методы, переданные в Class.create.

Ну и наконец, мы изменили Class.create так, чтобы он принимал переменное число аргументов, так что вы можете указать несколько коллекций инстансных методов для добавления в класс. Это удобный механизм добавления примесей (mixin) в класс, перед определением ваших собственных методов:

var Bar = Class.create(Foo, Enumerable, SomeMixin, { /* instance methods */ });
var Baz = Class.create(Enumerable, { /* instance methods */ });

Вы можете заглянуть в наш “Учебный” раздел чтобы ознакомиться с полноценным руководством по классам и наследованию в Prototype.

Изменения в Event API

Произошло маленькое, но важное изменение относительно пользовательских событий в [7835]: имена всех пользовательских событий теперь должны включать пространство имён. Это наш вариант решения проблемы конфликтов имён пользовательских событий с нестандартными встроенными DOM события, вроде “mousewheel” и “DOMMouseScroll.”

Более значительное изменени, Prototype обрабатывал события с именами, представленными в массиве the Event.DOMEvents, как встроенные DOM события. Теперь, Prototype определяет наличие разделителя пространства имён — одиночное двоеточие — чтобы определить какой тип события вы обрабатываете - пользовательское событие или встроенное событие.

Вы должны обновить весь код, использующий событие “contentloaded” из 1.6.0_rc0, событие теперь имеет другое имя - “dom:loaded.” Так же вы должны добавить пространство имён ко всем другим пользовательским событиям, чтобы их можно было вызывать и обрабатывать. Мы советуем использовать уникальные существительные для пространств имён, и глаголы в прошедшем времени для имён событий (например “effect:queued”, “widget:activated”, и т.д.).

Мы так же исправили небольшую проблему, присущую пользователям, которые продолжают использовать inline-обработчики событий в своём коде: они не могли остановить распространение события с помощью Event.stop(e) в IE, потому что event объект не был расширен. Теперь Event.stop и Event.element распространяются на полученный event-объект автоматически и работают как ожидается в случае с inline обработкой событий. Заметьте, что использование inline-обработчиков событий по прежденему не приветствуется; вам стоит перевести ваш код на использование Event.observe или Element#observe методов, там где это возможно.

Полностью переписан класс Hash

Backwards compatibility change – несмотря на то, что хеш служит для тех же целей, что и ранее, новая версия не совместима с Hash классом из предыдущих версий Prototype.

Свойства хеша теперь скрыты в приватном хранилище для предотвращения случаев коллизии с инстансными методами и примесными методами хеша. Это значит что теперь прочитать/записать/удалить свойства хеша напрямую не получится; вы должны использовать инстансные методы Hash#get(key), Hash#set(key, value) и Hash#unset(key). К примеру:

var myhash = new Hash();

// старое API  -->  новое API
myhash.name = "Вова";  -->  myhash.set('name', 'Вова');
myhash.name;          -->  myhash.get('name');
delete myhash.name;   -->  myhash.unset('name');

Вы также должны ознакомиться с другими изменениями в Hash API:

Другие изменения в это релизе

С момента выхода 1.6.0_rc0 мы исправили 19 багов; смотрите CHANGELOG, чтобы узнать более детальную информацию.

Закачка, Отчет об ошибках, и Получение помощи

Спасибо большому числу контрибьютеров, благодаря которым этот релиз стал возможным! RC1 будет нашим последним релиз кандидатом, исключая багфиксы, и вы можете ждать финальной версии 1.6.0 в начале ноября.


translated by vectoroc