Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.07.2014, 12:00
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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

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

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".
Ответить с цитированием
  #2 (permalink)  
Старый 28.07.2014, 12:07
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

И нафиг это нужно?
Ответить с цитированием
  #3 (permalink)  
Старый 28.07.2014, 12:10
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от Sweet Посмотреть сообщение
И нафиг это нужно?
Это нужно для удобного написания большого js приложения с множеством объектов и наследованием.
Это придает коду больше строгости (когда 1 класс находится в 1 файле и не может быть раскидан по проекту). Да и просто удобство.
Ответить с цитированием
  #4 (permalink)  
Старый 28.07.2014, 12:13
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

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

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

Последний раз редактировалось Aetae, 28.07.2014 в 12:15.
Ответить с цитированием
  #5 (permalink)  
Старый 28.07.2014, 12:16
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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

Неужели никто не пользуется такими вещами? Даже typeScript генерирует классы по почти такойже обертке.
Ответить с цитированием
  #6 (permalink)  
Старый 28.07.2014, 12:32
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

tsigel, увы пользуются.
Лучшеб действительно на тайпскрипт и подобное сразу переходили и не мучали js.
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 28.07.2014, 12:54
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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

Обертки такого рода убирают саму возможность такого рукожопства и придают единую стилистику кода.
Ответить с цитированием
  #8 (permalink)  
Старый 28.07.2014, 13:00
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от tsigel
Это нужно для удобного написания большого js приложения с множеством объектов и наследованием.
Твоя обёрточка не решает проблем, возникающих при "написания большого js приложения с множеством объектов и наследованием". Основная проблема - сборка и минификация кучи классов в сборки. Так что выбирайся из иллюзорного мира, где проблемы больших js-приложений решаются в 50 строк кода.
Ответить с цитированием
  #9 (permalink)  
Старый 28.07.2014, 13:06
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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

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

И кстати мы на брудершафт не пили. Не нравится - так и скажи. А лучше объясни почему. Я готов к конструктивному диалогу.
Ответить с цитированием
  #10 (permalink)  
Старый 28.07.2014, 13:08
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу jQuery плагин для создания меню Zeboton jQuery 9 15.09.2014 15:31
Некорректно работает функция для создания элементов exec Общие вопросы Javascript 4 13.07.2010 11:15
подходит ли javascript для создания ресурса похожего на fotki.yandex.ru wiedii Общие вопросы Javascript 1 07.03.2010 12:01
фабрика классов для mootools vkovalev72 Библиотеки/Тулкиты/Фреймворки 2 25.09.2008 17:14
Либа для создания окон Кирпич Библиотеки/Тулкиты/Фреймворки 8 25.06.2008 16:44