atomjs icon indicating copy to clipboard operation
atomjs copied to clipboard

mixin в atom.declare

Open llevkin opened this issue 11 years ago • 4 comments

Здравствуйте 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? или это бага? Заранее спасибо.

llevkin avatar Apr 26 '13 07:04 llevkin

Извините за столь долгий ответ. Я им давно не пользовался, видимо, это таки баг Миксина. Скорее всего у меня есть мысли вообще удалить Миксин из declare.

theshock avatar May 24 '13 16:05 theshock

Необходима ли эта функциональность?

theshock avatar May 24 '13 16:05 theshock

На мой взгляд, это очень полезная функциональность, в плане того, что удобно реализовывать общую интерфейсную базу для похожих сущностей, а так же разбивать большие классы на модули. Так же если нет необходимости использовать в проекте 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.

С уважением, Леонид.

llevkin avatar Jun 03 '13 08:06 llevkin

поправка с учётом аксессоров.. 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]; }

llevkin avatar Aug 13 '13 06:08 llevkin