Довольно часто приходится писать сложные интерфейсы на JavaScript, и тогда без фреймворка не обойтись. Мой выбор давно остановился на Mootools, так как помимо удобного синтаксиса и легковестности у него в комплекте сразу же идет и куча визуальных эффектов.
Но вот недавно столкнулся с одним неприятным багом — во время инстанциирования объектов, свойства класса, сконфигурированные объектами, передаются по ссылке, а не копируются в каждый экземпляр. Рассмотрим следующий код:
var ca = new Class( { hash_field : new Hash() } ); var a = new ca(); var b = new ca(); a.hash_field.set( 'val1', 1 ); b.hash_field.set( 'val2', 2 ); console.log( a.hash_field ); console.log( b.hash_field );
Что ожидаем в выводе? Нечто вроде:
{
val1 : 1
}
-----------------
{
val2 : 2
}
А вот что получаем, на самом деле:
{
val1 : 1,
val2 : 2
}
----------------
{
val1 : 1,
val2 : 2
}
То-есть очевидно, что два разных объекта одного и того же класса ссылаются на общее свойство hash_field, что не есть хорошо… В связи с этим может появляться много неприятных багов в приложении, которые достаточно сложно обнаружить, так что имейте это ввиду и инициализируйте свойства из конструктора:
[...skipped...] initialize : function () { this.hash_field = new Hash(); } [...skipped...]
Это не баг, это ошибочный код: при создании класса (а не объекта этого класса) ему передаётся один конкретный экземпляр Hash, который затем и используется во всех объектах.
я об этом и говорю, что они упустили момент с клонированием объектов при «инстанциировании» экзепляров «классов».
А раз поведение неправильное, значит это — баг