forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   JavaScript / HTML (http://forum.boolean.name/forumdisplay.php?f=136)
-   -   class.js (http://forum.boolean.name/showthread.php?t=18803)

moka 21.12.2013 21:19

class.js
 
Классическое наследование используя .prototype порой слишком "многословно" и хочется использовать что-то попроще и более схожее с другими языками. Факт остаётся фактом что в JS ECMA 5 до сих пор нету классов (ECMA 6 будет и очень приятные, но этого пока нету), используя .prototype их можно симулировать и больше чем просто классы тоже (но это отдельная тема).
Я использовал MooTools и другие библиотеки для классов, но решил замутить свою, со своими плюшками, как обычно изобретение велосипеда - но опыт хороший.

Ссылка: http://goo.gl/tRdo52

Библиотека позволяет создавать классы и наследовать их, также реализовывать prototype и constructor от других классов либо классических prototype'ов. И дополнительно к этому проверять наследует ли экземпляр другой класс (extends), или имплиментирует ли (implements), и является ли класс самого экземляра конкретным классом (typeof).

Пример работы:

PHP код:

// классический 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 


Phantom 22.12.2013 01:46

Ответ: class.js
 
Мне вот только интересно. В ActionScript, который тоже основан на ECMA, есть классы. В JavaScript слово class является зарезервированным. Так в чём же дело-то? Запилили бы уже.

moka 22.12.2013 01:57

Ответ: 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/

Phantom 22.12.2013 07:47

Ответ: class.js
 
Про harmony знаю, да. Генераторы использовал ради интереса в node-webkit. А про классы почему-то не слышал.

ABTOMAT 22.12.2013 09:00

Ответ: class.js
 
Цитата:

Сообщение от moka (Сообщение 271737)
Классическое наследование используя .prototype порой слишком "многословно"

А мне норм

pax 22.12.2013 17:25

Ответ: class.js
 
А я пока наследование не использовал, что-то не было такой надобности.

moka 23.12.2013 03:24

Ответ: class.js
 
Цитата:

Сообщение от pax (Сообщение 271775)
А я пока наследование не использовал, что-то не было такой надобности.

Наследование многие рассматривают как anti-pattern т.к. сторонники data-driven архитектуры. Тем более в node.js, если пишешь модульные системы (много micro-процессов) то естественно наследование и т.п. не уместно.

Плюсы в .prototype это когда есть данные, и нужно ими шаблонно оперировать, иметь методы и передавать туда данные и получать результат - это одно. А иметь объект и манипулировать напрямую - красивее тех. дизайн выходит.


Часовой пояс GMT +4, время: 16:43.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot