Pull to refresh

Comments 39

mootools тоже смотрел, не очень он мне нравится, что-то было с ним не так, уже не вспомню, я месяца 3 назад это наваял. Кстати, не заметил там возможности вызова родительского метода в классе-наследнике.
* в переписанном методе класса-наследника
Кстати, не заметил там возможности вызова родительского метода в классе-наследнике.

this.parent()
ок, 86 кб ради наследования?
Нет, ради замечательных возможностей, в число которых входят классы с разного типа мутаторами, включая наследования и примеси.
Кстати ради интереса скачал сборку, 12.2кб.
мне это все было не нужно, хотя ядро его можно глянуть ради интереса, времени как всегда в обрез
да, это приятный побочный эффект )
на деле не использовал его, просто пример привел, что возможно + все методы всех родителей доступны
Откровенно говоря решение ужасное. Чем
function Child12() {
  ExtClass.call(this, {
    Child1: null,
    Child2: null
  });

  this.message = function() {
    // вызов по очереди одноименного метода всех родительских классов
    var message = this.$super['Parent1'].message.call(this) + "\n";
    message += this.$super['Parent2'].message.call(this) + "\n";
    message += this.$super['Child1'].message.call(this) + "\n";
    message += this.$super['Child2'].message.call(this) + "\n";
    // ну и от себя )
    message += 'Child12::message'
    return message;
  }
}


Лучше, чем?

function Child12() {
  Child1.call( this );
  Child2.call( this );

  this.message = function() {
    // вызов по очереди одноименного метода всех родительских классов
    var message = Parent1.message.call(this) + "\n";
    message += Parent2.message.call(this) + "\n";
    message += Child1.message.call(this) + "\n";
    message += Child2.message.call(this) + "\n";
    // ну и от себя )
    message += 'Child12::message'
    return message;
  }
}


Или

Child12 = new Class({
  Implements: [ Child1, Child2 ],

  message: function() {
    // вызов по очереди одноименного метода всех родительских классов
    var message = Parent1.message.call(this) + "\n";
    message += Parent2.message.call(this) + "\n";
    message += Child1.message.call(this) + "\n";
    message += Child2.message.call(this) + "\n";
    // ну и от себя )
    message += 'Child12::message'
    return message;
  }
});
Те коды, что я привёл — тоже работаю. Первый — без обёрток, второй — при помощи мутулз или атомжс.
function Parent1() {
this.message = function() {
return 'Parent1::message';
};
};

function Parent2() {
this.message = function() {
return 'Parent2::message';
};
};

function Child12() {
Parent1.call(this);
Parent2.call(this);
this.message = function() {
var message = Parent1.message.call(this) + "\n";
message += Parent2.message.call(this) + "\n";
message += 'Child12::message'
return message;
};
};

var test = new Child12();
alert(test.message());

>> Первый — без обёрток:
Error: Parent1.message is undefined
Да, первый вариант — кривой, согласен.
Но у вас в библиотеке каждый раз при наследовании вызывается конструктор класса?
да, и это недостаток
но с другой стороны, в моей реализации конструктор ExtClass должен быть вызван для записи родительских классов и их методов, решение требует напильника, но я не JS-ник, чтоб сильно заморачиваться
Раз вы не JS-ник, то не стоит писать велосипеды на JS, а довериться в этом деле профессионалам JS-никам)
Это лучше, чем кляньчить инвайты у знакомых ;)
К тому же, вроде ничего подобного я не встречал, может надо было в «Ненормальное программирование»?
Ну я вас не осуждаю и старания похвальны. Главное — опыт и понимание, почему большинство классовых систем пошли именно таким путем.
и кстати, прототипом для такого метода наследования послужил как раз Ваш неработающий вариант, а потом стало интересно поковыряться
второй вариант на c подключенным mootools.js тоже не работает ;)
Parent1 = new Class({
  message: function() {
    return 'Parent1::message';
  }
});

Parent2 = new Class({
  message: function() {
    return 'Parent2::message';
  }
});

Child12 = new Class({
  Implements: [ Parent1, Parent2 ],

  message: function() {
    // вызов по очереди одноименного метода всех родительских классов
    var message = Parent1.message.call(this) + "\n";
    message += Parent2.message.call(this) + "\n";
    message += 'Child12::message'
    return message;
  }
});

myChild = new Child12();
alert(myChild.message());

дает ту же ошибку, в принципе ожидаемо:
Error: Parent1.message is undefined
по-поводу mootools.js, проверил, там нет некоторых побочных артефактов, присущих ajaxoop.js
по-моему, я его «сбрил» за схожесть синтаксиса наследования с ajaxoop.js, который «правил» свойство всех объектов родительского класса при измении свойства объекта наследуемого класса.
Да, Мутулз таким не страдает.
Не лично вам сказано, а вообще: заметил такую особенность, что мутулс сразу же отбрасывают как какойто еретический фреймворк, только потому что ктото когдато написал о вреде изменения прототипов нативных обьектов, и все ему до сих пор потакают (в большей степени благодаря популярности всем известного фреймворка), не думая о том что у каждого из подходов (изменение прототипов, ипользование врапперов) есть свои плюсы и минусы. Это мне напоминает советский союз с его пропагандой: даже через 20 лет после его развала люди продолжают верить во всякий бред когда-то продвигаемый партией.
Стоит заметить что треть API mootools попало в спецификацию ECMA5 под тем или иным видом, интересно какой еще фреймворк может таким похвалиться.
вообще, я дышу ровно, но есть вероятность наложений, если править прототипы базовых объектов, к примеру, я использую библиотеку mootools.js и superlibrary.js (все совпадения имен случайны )), если мы на прототип Array навешиваем indexOf, то в mootols, к примеру, если элемент не найден, возвращается -1, а в superlibrary -2 (а -1 зарезервирован для другого послания).
Так вот, если добавлять в прототип через проверку на существование метода indexOf, то тут зависит от того, какая библиотека подключена первой, а если без проверки, то какая последней, в любом из этих случаев другая библиотека перестанет функционировать корректно
На самом деле из «ужасного» я вижу только «корявость» вызова родительского метода, можно обернуть в метод:
this.parent = function(parentName, methodName, ...args...) {
  ...
};


причем, имеем преимущество в том, что обращаться из люого метода потомка можно к любому методу любого родителя
сейчас практически все используют фреймворки ( и это очень хорошо), а у в них (не во всех конечно)
но уже реализованы такие штуки, если надо отдельно то вот например microjs.com/#class
можете добавить свое творение туда :)
спасибо, а то у меня костыли еще в моде
Обращайтесь если что.
хм, теперь интересно плагин для jQuery под класс mootools накатать, чтоб можно было использовать что-то типа:
var myNewClass = $.jClass({
  Extends: myParentClass,
  // ... и т.д.
});

короче, разведка кода попыткой переделывания, про Class.Mutators.jQuery видел
Ну, moo4q (Class.Mutators.jQuery) есть лучшей реализацией етого.
Ну это не совсем то, что я хочу сделать.
Там классы создаются средствами mootools, а потом инстанциируются средствами jQuery с привязкой к DOM-элементу. То есть Class.Mutators.jQuery выступает в роли «генератора плагинов» для jQuery средствами mootools (плагин в виде класса на mootools).
Я же хотел бы реализовать сам API по созданию классов аналогичный mootools, только средствами jQuery и сделать все в виде jQuery плагина. Заодно и начинку mootools вблизи посмотреть.
В идеале, если удастся реализовать еще и с мутаторами, то получится не просто плагин по созданию классов, но и можно будет добавить аналогичный jQuery мутатор, то есть в итоге будет плагин, способный на создание плагинов, в основе которых классы. Надеюсь не слишком сложное предложение получилось )
Почему бы просто не подключить паралельно с jQuery классовую систему MooTools? Они не конфликтуют.
потому что интересно поковырять mootools внутри
Sign up to leave a comment.

Articles