Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Удобная обертка для создания классов с наследованием (https://javascript.ru/forum/project/49068-udobnaya-obertka-dlya-sozdaniya-klassov-s-nasledovaniem.html)

tsigel 28.07.2014 12:00

Удобная обертка для создания классов с наследованием
 
Здравствуйте!

Предлагаю вашему вниманию удобную обертку для создания классов с наследованием:

var Class = (function() {

    var constructor = function( options ) {
        if( options.extends ) {
            var parent = options.extends.prototype;
        }

        var __constructor = options.hasOwnProperty('constructor') ?
            options.constructor : (parent ? function() {
            parent.constructor.apply( this, arguments );
        } : function() {});

        var constructor = function() {
            if (options.defaults) {
                for (var i in options.defaults) {
                    this[i] = options.defaults[i];
                }
            }
            __constructor.apply(this,arguments);
        };

        if( parent ) {
            var fn = function() {};
            fn.prototype = parent;
            constructor.prototype = new fn();
            constructor.prototype.constructor = constructor;
        }

        if( options.static ) {
            for( var i in options.static )
                constructor[i] = options.static[i];
        }

        for( var i in options )
            if( i != 'static' && i != 'constructor' && i != 'extends' )
                constructor.prototype[i] = options[i];

        constructor.extend = function( options ) {
            options.extends = this;
            return new Class( options  );
        };

        return constructor;
    };

    var prototype = constructor.prototype;
    return constructor;
})();

// Пример использования

var SomeClass = new Class({
   constructor: function (a) {
      this.a = a;
   },
   say: function () {
      alert(this.a);
   }
});

var SomeExtend = SomeClass.extend({
   say2: function () {
       alert(this.a + "2");
   }
});

var a = new SomeClass(1);
a.say();
var b = new SomeExtend(2);
b.say();
b.say2();


Конструктор можно передавать - можно не передавать. Если не передавать - берется либо пустая функция либо конструктор родителя.
Можно передавать объект статических свойств под ключем "static".

Sweet 28.07.2014 12:07

И нафиг это нужно?

tsigel 28.07.2014 12:10

Цитата:

Сообщение от Sweet (Сообщение 323044)
И нафиг это нужно?

Это нужно для удобного написания большого js приложения с множеством объектов и наследованием.
Это придает коду больше строгости (когда 1 класс находится в 1 файле и не может быть раскидан по проекту). Да и просто удобство.

Aetae 28.07.2014 12:13

Sweet, расслабься. Все, кто приходят из языков с классическим ООП, обязательно пишут свою функцию Class подобную этой. Это уже можно называть традицией.:)

Кто-то потом вкуривает в прототипы, а после кого-то javascript'ерам приходится рыться в этой class'овой мерзости. C'est la vie.

tsigel 28.07.2014 12:16

Я вообщем-то вкурил в прототипы вполне.
Вроде)

Неужели никто не пользуется такими вещами? Даже typeScript генерирует классы по почти такойже обертке.

Aetae 28.07.2014 12:32

tsigel, увы пользуются. :(
Лучшеб действительно на тайпскрипт и подобное сразу переходили и не мучали js.

tsigel 28.07.2014 12:54

Aetae,
Эта обертка ничуть не усложняет чтение кода. И с оберткой и без обертки можно писать как и читабельный и хороший код, так и страшный говнокод. Например сейчас я занимаюсь тем что переписываю говнокод за людьми которые не юзали никаких оберток. Это не им мешало написать много неподдерживаемого и малопонятного кода. И эта привычка людей плохо знакомых с ООП писать прототип родителя в ключик "superClass" чтобы пользовать переопределенные методы с помощью this.superClass.someMethod просто вымораживает. Самое смешное когда они наследуются дважды.

Обертки такого рода убирают саму возможность такого рукожопства и придают единую стилистику кода.

Sweet 28.07.2014 13:00

Цитата:

Сообщение от tsigel
Это нужно для удобного написания большого js приложения с множеством объектов и наследованием.

Твоя обёрточка не решает проблем, возникающих при "написания большого js приложения с множеством объектов и наследованием". Основная проблема - сборка и минификация кучи классов в сборки. Так что выбирайся из иллюзорного мира, где проблемы больших js-приложений решаются в 50 строк кода.

tsigel 28.07.2014 13:06

Sweet,
Я вообщем-то не живу в "иллюзорном" мире) Сборка и минификация - это совершенно другая тема мало связанная с текущей.

Есть gulp и grunt.
Requierjs тоже умеет собирать зависимости в 1 файлик. Вопрос лишь в самом удобстве создания этого приложения. Минификация - это подготовка к продакшену.

И кстати мы на брудершафт не пили. Не нравится - так и скажи. А лучше объясни почему. Я готов к конструктивному диалогу.

Sweet 28.07.2014 13:08

tsigel, поменьше общайся с рукожопыми. А то возомнишь себя супергением:D

Sweet 28.07.2014 13:15

Цитата:

Сообщение от tsigel
Не нравится - так и скажи. А лучше объясни почему.

Мне не "не нравится". Просто такая обертка ничего по сути не делает. Вот у меня есть куча файлов, в каждом из которых класс. Как мне их собрать? Есть require. Там хотя бы зависимости прописываются. А минификация при твоём подходе вообще отсутствует. Максимум, локальные переменные пожмутся.

kobezzza 28.07.2014 13:16

Лучше пользоваться транслятором ES6 и писать в нативном JS синтаксисе.

class Foo {
    constructor() {
        ...
    }
}

class Bar extends Foo {
    constructor() {
        super();
        ...
    }
}


Цитата:

Неужели никто не пользуется такими вещами?
Конечно пользуюсь. Просто этих обёрток уже овер9000, поэтому каждый раз, как кто-то презентирует новую, то люди негодуют)

tsigel 28.07.2014 13:21

Цитата:

Сообщение от Sweet (Сообщение 323069)
Просто такая обертка ничего по сути не делает.

Да. Так просто удобнее.

А скажите, как вы наследуетесь в своем приложении?
Каждый раз копируете 3 строки которые есть почти в каждом файле? Т.к. в большом приложении почти все объекты - наследники.

Не зря же сделали доки @class которые работают с обертками.

tsigel 28.07.2014 13:30

Ладно, я понял что обертка - боян. Простите что отнял у вас время.

Sweet 28.07.2014 13:34

Цитата:

Сообщение от tsigel
А скажите, как вы наследуетесь в своем приложении?

А никак! Я просто не пишу приложения. Нет приложений - нет проблем!
Шучу, конечно. Просто не могу говорить на эту тему: а то меня расстреляют за разглашение секретной инфы!:)

nerv_ 28.07.2014 13:40

Цитата:

Сообщение от tsigel
А скажите, как вы наследуетесь в своем приложении?

http://javascript.ru/forum/offtopic/...kriptorov.html
только дескрипторы не исопльзую

вот и все наследование (по сути)

Цитата:

Сообщение от Sweet
Просто не могу говорить на эту тему: а то меня расстреляют за разглашение секретной инфы!

тайна в том, что тайны нет :)

Sweet 28.07.2014 14:15

Цитата:

Сообщение от nerv_
тайна в том, что тайны нет

Не, всё хитрее:) Есть тайна, и я говорю, что она есть. Но делаю это так, что кажется, что я просто толстый тролль. И все думают, что я чмо и ничего в жизни не добился. И больше не спрашивают про мою тайну. Вообще больше не разговаривают со мной... Хитрый план такой хитрый!!!:D


Часовой пояс GMT +3, время: 02:29.