Comments 39
mootools тоже смотрел, не очень он мне нравится, что-то было с ним не так, уже не вспомню, я месяца 3 назад это наваял. Кстати, не заметил там возможности вызова родительского метода в классе-наследнике.
0
Множественное наследование редко требуется, хотя идея интересная.
Посмотрите, кстати, на base2.js от Дэна Эдвардса.
Посмотрите, кстати, на base2.js от Дэна Эдвардса.
0
Откровенно говоря решение ужасное. Чем
Лучше, чем?
Или
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;
}
});
+1
>> Лучше, чем?
эммм… тем, что мой код работает ;)
>> Или
habrahabr.ru/blogs/javascript/128000/#comment_4227627
эммм… тем, что мой код работает ;)
>> Или
habrahabr.ru/blogs/javascript/128000/#comment_4227627
+1
Те коды, что я привёл — тоже работаю. Первый — без обёрток, второй — при помощи мутулз или атомжс.
0
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
0
Да, первый вариант — кривой, согласен.
Но у вас в библиотеке каждый раз при наследовании вызывается конструктор класса?
Но у вас в библиотеке каждый раз при наследовании вызывается конструктор класса?
0
да, и это недостаток
0
но с другой стороны, в моей реализации конструктор ExtClass должен быть вызван для записи родительских классов и их методов, решение требует напильника, но я не JS-ник, чтоб сильно заморачиваться
0
Раз вы не JS-ник, то не стоит писать велосипеды на JS, а довериться в этом деле профессионалам JS-никам)
0
Это лучше, чем кляньчить инвайты у знакомых ;)
К тому же, вроде ничего подобного я не встречал, может надо было в «Ненормальное программирование»?
К тому же, вроде ничего подобного я не встречал, может надо было в «Ненормальное программирование»?
0
и кстати, прототипом для такого метода наследования послужил как раз Ваш неработающий вариант, а потом стало интересно поковыряться
0
второй вариант на 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
0
по-поводу mootools.js, проверил, там нет некоторых побочных артефактов, присущих ajaxoop.js
по-моему, я его «сбрил» за схожесть синтаксиса наследования с ajaxoop.js, который «правил» свойство всех объектов родительского класса при измении свойства объекта наследуемого класса.
по-моему, я его «сбрил» за схожесть синтаксиса наследования с ajaxoop.js, который «правил» свойство всех объектов родительского класса при измении свойства объекта наследуемого класса.
0
Да, Мутулз таким не страдает.
0
Не лично вам сказано, а вообще: заметил такую особенность, что мутулс сразу же отбрасывают как какойто еретический фреймворк, только потому что ктото когдато написал о вреде изменения прототипов нативных обьектов, и все ему до сих пор потакают (в большей степени благодаря популярности всем известного фреймворка), не думая о том что у каждого из подходов (изменение прототипов, ипользование врапперов) есть свои плюсы и минусы. Это мне напоминает советский союз с его пропагандой: даже через 20 лет после его развала люди продолжают верить во всякий бред когда-то продвигаемый партией.
+1
Стоит заметить что треть API mootools попало в спецификацию ECMA5 под тем или иным видом, интересно какой еще фреймворк может таким похвалиться.
0
вообще, я дышу ровно, но есть вероятность наложений, если править прототипы базовых объектов, к примеру, я использую библиотеку mootools.js и superlibrary.js (все совпадения имен случайны )), если мы на прототип Array навешиваем indexOf, то в mootols, к примеру, если элемент не найден, возвращается -1, а в superlibrary -2 (а -1 зарезервирован для другого послания).
Так вот, если добавлять в прототип через проверку на существование метода indexOf, то тут зависит от того, какая библиотека подключена первой, а если без проверки, то какая последней, в любом из этих случаев другая библиотека перестанет функционировать корректно
Так вот, если добавлять в прототип через проверку на существование метода indexOf, то тут зависит от того, какая библиотека подключена первой, а если без проверки, то какая последней, в любом из этих случаев другая библиотека перестанет функционировать корректно
0
На самом деле из «ужасного» я вижу только «корявость» вызова родительского метода, можно обернуть в метод:
причем, имеем преимущество в том, что обращаться из люого метода потомка можно к любому методу любого родителя
this.parent = function(parentName, methodName, ...args...) {
...
};
причем, имеем преимущество в том, что обращаться из люого метода потомка можно к любому методу любого родителя
0
сейчас практически все используют фреймворки ( и это очень хорошо), а у в них (не во всех конечно)
но уже реализованы такие штуки, если надо отдельно то вот например microjs.com/#class
можете добавить свое творение туда :)
но уже реализованы такие штуки, если надо отдельно то вот например microjs.com/#class
можете добавить свое творение туда :)
0
eval(className) -> wndow[className]
0
спасибо, а то у меня костыли еще в моде
0
все, ушел читать код mootools
0
Обращайтесь если что.
0
хм, теперь интересно плагин для jQuery под класс mootools накатать, чтоб можно было использовать что-то типа:
короче, разведка кода попыткой переделывания, про Class.Mutators.jQuery видел
var myNewClass = $.jClass({
Extends: myParentClass,
// ... и т.д.
});
короче, разведка кода попыткой переделывания, про Class.Mutators.jQuery видел
0
Ну, moo4q (Class.Mutators.jQuery) есть лучшей реализацией етого.
0
Ну это не совсем то, что я хочу сделать.
Там классы создаются средствами 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 мутатор, то есть в итоге будет плагин, способный на создание плагинов, в основе которых классы. Надеюсь не слишком сложное предложение получилось )
0
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
…
0
Sign up to leave a comment.
Javascript: «классы» и наследование