atomjs
atomjs copied to clipboard
mixin в atom.declare
Здравствуйте theshock! Прежде всего огромное спасибо за такие замечательные библиотеки - atom.js и libCanvas.
Скажите, судя по коду, atom.declare должен поддерживать свойство mixin, но при подмешивании к классу свойства не появляются. В документации mixin для atom.declare отсутствует. Делаю так:
atom.declare('Test', { test: function() { console.log(1); }, });
atom.declare('Test2, { mixin: [Test], prototype: { initialize: function() { console.log(this.test); //undefined }, }, });
Должен ли поддерживать atom.declare mixin? или это бага? Заранее спасибо.
Извините за столь долгий ответ. Я им давно не пользовался, видимо, это таки баг Миксина. Скорее всего у меня есть мысли вообще удалить Миксин из declare.
Необходима ли эта функциональность?
На мой взгляд, это очень полезная функциональность, в плане того, что удобно реализовывать общую интерфейсную базу для похожих сущностей, а так же разбивать большие классы на модули. Так же если нет необходимости использовать в проекте mixin, то на мой взгляд проверка на отсутствие свойства mixin не сильно снизит производительность фрэймворка в целом..
В любом случае это имхо, автор фрэймворка - вы и решать вам)
Покопавшись немного в atom.js мне таки удалось заставить mixin работать... Правда в моём случае это получилось довольно (костыльно)/(не элегантно)/(не судите строго) =), ибо не очень хорошо ориентируюсь в atom.js изнутри. На всякий случай выложу участок кода (примерно 1851 строка):
mixin: function (target, items) { if (!Array.isArray(items)) items = [ items ]; for (var i = 0, l = items.length; i < l; i++) { // My code start here var source = methods.proto(items[i]); for (j in source) if (j != 'initialize' && j != 'constructor' && j != 'bindMethods' && j != 'toString' && typeof source[j] === 'function') target.prototype[j] = source[j]; // My code end here
// original code start here
//methods.addTo( target.prototype, methods.proto(items[i]) );
// original code end here
}
return this;
},
Если не ошибаюсь, то в вашем случае hasOwnProperty - отсеивает таки методы прототипа mixin.
С уважением, Леонид.
поправка с учётом аксессоров.. for (j in source) { if (!atom.accessors.inherit(source, target.prototype, j) && j != 'initialize' && j != 'constructor' && j != 'bindMethods' && j != 'toString' && typeof source[j] === 'function') target.prototype[j] = source[j]; }