|
JavaScript / HTML Создание динамической разметки страниц |
21.12.2013, 21:19
|
#1
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
class.js
Классическое наследование используя .prototype порой слишком "многословно" и хочется использовать что-то попроще и более схожее с другими языками. Факт остаётся фактом что в JS ECMA 5 до сих пор нету классов (ECMA 6 будет и очень приятные, но этого пока нету), используя .prototype их можно симулировать и больше чем просто классы тоже (но это отдельная тема).
Я использовал MooTools и другие библиотеки для классов, но решил замутить свою, со своими плюшками, как обычно изобретение велосипеда - но опыт хороший.
Ссылка: http://goo.gl/tRdo52
Библиотека позволяет создавать классы и наследовать их, также реализовывать prototype и constructor от других классов либо классических prototype'ов. И дополнительно к этому проверять наследует ли экземпляр другой класс (extends), или имплиментирует ли (implements), и является ли класс самого экземляра конкретным классом (typeof).
Пример работы:
// классический prototype, может быть с наследованием function Charlie() { this.delta = 'myDelta'; } // prototype метод Charlie.prototype.work = function() { this.delta += Math.random(); };
// отцовский класс var Parent = Class.extend({ name: 'Parent', constructor: function(options) { this.foo = options.foo || 'no foo!'; }, fooMethod: function() { return this.foo.toUpperCase(); }, bazMethod: function() { return this.foo + ' extra text'; } });
// класс наследует Parent и исплементирует Charlie var Child = Parent.extend({ name: 'Child', implement: [ Charlie ], constructor: function(options) { this.bar = options.bar || 'no bar!'; }, bazMethod: function(ext) { // этот метод вызовет метод отцовского класса return this.super('bazMethod') + ext; } });
// экземпляр класса Child var child = new Child({ foo: 'imFoo' });
child.fooMethod(); // 'IMFOO' child.bazMethod(' hey!'); // 'imFoo extra text hey!' child.delta; // 'myDelta' child.work(); // добавит произвольное число в поле 'delta' child.delta; // 'myDelta0.6905072722584009'
child.implements(Charlie); // true child.extends(Parent); // true child.typeof(Child); // true
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
|
|
22.12.2013, 01:46
|
#2
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: class.js
Мне вот только интересно. В ActionScript, который тоже основан на ECMA, есть классы. В JavaScript слово class является зарезервированным. Так в чём же дело-то? Запилили бы уже.
|
(Offline)
|
|
22.12.2013, 01:57
|
#3
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: class.js
Запилили в стандарте: http://wiki.ecmascript.org/doku.php?id=harmony:classes
Но стандарт ECMA6 будет закончен к концу 2014 года только. Классы - весьма большая фича и она будет одной из последних реализована в броузерах. Но уже сейчас много чего есть, например FF уже зарелизили Generators (yield) что весьма большая фича и расширяет язык - можно делать свои итераторы, иметь контролируемый async code flow, и многое другое.
Вот отличная таблица совместимостей. В последней колонке (Node Harmony) - это если запускать node.js со спец флагом, можно юзать уже. Chrome и Node будут паралельны в этой таблице, т.к. оба используют общий стак технологий для JS.
Firefox же радует, что весьма лидирует по имплементации фичей, например arrow functions у FF уже давно.
http://kangax.github.io/es5-compat-table/es6/
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.12.2013, 07:47
|
#4
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: class.js
Про harmony знаю, да. Генераторы использовал ради интереса в node-webkit. А про классы почему-то не слышал.
|
(Offline)
|
|
22.12.2013, 09:00
|
#5
|
Ференька
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,742
Написано 5,461 полезных сообщений (для 15,675 пользователей)
|
Ответ: class.js
Сообщение от moka
Классическое наследование используя .prototype порой слишком "многословно"
|
А мне норм
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**
* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена
|
(Offline)
|
|
22.12.2013, 17:25
|
#6
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: class.js
А я пока наследование не использовал, что-то не было такой надобности.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.12.2013, 03:24
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: class.js
Сообщение от pax
А я пока наследование не использовал, что-то не было такой надобности.
|
Наследование многие рассматривают как anti-pattern т.к. сторонники data-driven архитектуры. Тем более в node.js, если пишешь модульные системы (много micro-процессов) то естественно наследование и т.п. не уместно.
Плюсы в .prototype это когда есть данные, и нужно ими шаблонно оперировать, иметь методы и передавать туда данные и получать результат - это одно. А иметь объект и манипулировать напрямую - красивее тех. дизайн выходит.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:34.
|