Feed Rss



Окт 26 2009

Неявная сылка в Mootools.Class

рубрика: Javascript Автор:

Довольно часто приходится писать сложные интерфейсы на 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...]
Понравился пост? Подпишись на RSS!

Метки: , ,

2 ответов на “Неявная сылка в Mootools.Class”

  1. besisland.name/ says:

    Это не баг, это ошибочный код: при создании класса (а не объекта этого класса) ему передаётся один конкретный экземпляр Hash, который затем и используется во всех объектах.

  2. Алексей Токарь says:

    я об этом и говорю, что они упустили момент с клонированием объектов при «инстанциировании» экзепляров «классов».
    А раз поведение неправильное, значит это — баг