Comments 39
mootools тоже смотрел, не очень он мне нравится, что-то было с ним не так, уже не вспомню, я месяца 3 назад это наваял. Кстати, не заметил там возможности вызова родительского метода в классе-наследнике.
Множественное наследование редко требуется, хотя идея интересная.
Посмотрите, кстати, на base2.js от Дэна Эдвардса.
Посмотрите, кстати, на base2.js от Дэна Эдвардса.
Откровенно говоря решение ужасное. Чем
Лучше, чем?
Или
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;
}
});
>> Лучше, чем?
эммм… тем, что мой код работает ;)
>> Или
habrahabr.ru/blogs/javascript/128000/#comment_4227627
эммм… тем, что мой код работает ;)
>> Или
habrahabr.ru/blogs/javascript/128000/#comment_4227627
Те коды, что я привёл — тоже работаю. Первый — без обёрток, второй — при помощи мутулз или атомжс.
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
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 тоже не работает ;)
дает ту же ошибку, в принципе ожидаемо:
Error: Parent1.message is undefined
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, который «правил» свойство всех объектов родительского класса при измении свойства объекта наследуемого класса.
по-моему, я его «сбрил» за схожесть синтаксиса наследования с ajaxoop.js, который «правил» свойство всех объектов родительского класса при измении свойства объекта наследуемого класса.
Да, Мутулз таким не страдает.
Не лично вам сказано, а вообще: заметил такую особенность, что мутулс сразу же отбрасывают как какойто еретический фреймворк, только потому что ктото когдато написал о вреде изменения прототипов нативных обьектов, и все ему до сих пор потакают (в большей степени благодаря популярности всем известного фреймворка), не думая о том что у каждого из подходов (изменение прототипов, ипользование врапперов) есть свои плюсы и минусы. Это мне напоминает советский союз с его пропагандой: даже через 20 лет после его развала люди продолжают верить во всякий бред когда-то продвигаемый партией.
Стоит заметить что треть API mootools попало в спецификацию ECMA5 под тем или иным видом, интересно какой еще фреймворк может таким похвалиться.
вообще, я дышу ровно, но есть вероятность наложений, если править прототипы базовых объектов, к примеру, я использую библиотеку mootools.js и superlibrary.js (все совпадения имен случайны )), если мы на прототип Array навешиваем indexOf, то в mootols, к примеру, если элемент не найден, возвращается -1, а в superlibrary -2 (а -1 зарезервирован для другого послания).
Так вот, если добавлять в прототип через проверку на существование метода indexOf, то тут зависит от того, какая библиотека подключена первой, а если без проверки, то какая последней, в любом из этих случаев другая библиотека перестанет функционировать корректно
Так вот, если добавлять в прототип через проверку на существование метода indexOf, то тут зависит от того, какая библиотека подключена первой, а если без проверки, то какая последней, в любом из этих случаев другая библиотека перестанет функционировать корректно
На самом деле из «ужасного» я вижу только «корявость» вызова родительского метода, можно обернуть в метод:
причем, имеем преимущество в том, что обращаться из люого метода потомка можно к любому методу любого родителя
this.parent = function(parentName, methodName, ...args...) {
...
};
причем, имеем преимущество в том, что обращаться из люого метода потомка можно к любому методу любого родителя
сейчас практически все используют фреймворки ( и это очень хорошо), а у в них (не во всех конечно)
но уже реализованы такие штуки, если надо отдельно то вот например microjs.com/#class
можете добавить свое творение туда :)
но уже реализованы такие штуки, если надо отдельно то вот например microjs.com/#class
можете добавить свое творение туда :)
eval(className) -> wndow[className]
спасибо, а то у меня костыли еще в моде
все, ушел читать код mootools
Обращайтесь если что.
хм, теперь интересно плагин для jQuery под класс mootools накатать, чтоб можно было использовать что-то типа:
короче, разведка кода попыткой переделывания, про Class.Mutators.jQuery видел
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 мутатор, то есть в итоге будет плагин, способный на создание плагинов, в основе которых классы. Надеюсь не слишком сложное предложение получилось )
Там классы создаются средствами mootools, а потом инстанциируются средствами jQuery с привязкой к DOM-элементу. То есть Class.Mutators.jQuery выступает в роли «генератора плагинов» для jQuery средствами mootools (плагин в виде класса на mootools).
Я же хотел бы реализовать сам API по созданию классов аналогичный mootools, только средствами jQuery и сделать все в виде jQuery плагина. Заодно и начинку mootools вблизи посмотреть.
В идеале, если удастся реализовать еще и с мутаторами, то получится не просто плагин по созданию классов, но и можно будет добавить аналогичный jQuery мутатор, то есть в итоге будет плагин, способный на создание плагинов, в основе которых классы. Надеюсь не слишком сложное предложение получилось )
dojo.declare (http://docs.dojocampus.org/dojo/declare) => все продумано и испытано в боях
coffee => jashkenas.github.com/coffee-script/#classes
Ext.define => edspencer.net/2011/01/classes-in-ext-js-4-under-the-hood.html
jsclass.jcoglan.com/classes.html
…
coffee => jashkenas.github.com/coffee-script/#classes
Ext.define => edspencer.net/2011/01/classes-in-ext-js-4-under-the-hood.html
jsclass.jcoglan.com/classes.html
…
Sign up to leave a comment.
Javascript: «классы» и наследование