Удобная обертка для создания классов с наследованием
Здравствуйте!
Предлагаю вашему вниманию удобную обертку для создания классов с наследованием: 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". |
И нафиг это нужно?
|
Цитата:
Это придает коду больше строгости (когда 1 класс находится в 1 файле и не может быть раскидан по проекту). Да и просто удобство. |
Sweet, расслабься. Все, кто приходят из языков с классическим ООП, обязательно пишут свою функцию Class подобную этой. Это уже можно называть традицией.:)
Кто-то потом вкуривает в прототипы, а после кого-то javascript'ерам приходится рыться в этой class'овой мерзости. C'est la vie. |
Я вообщем-то вкурил в прототипы вполне.
Вроде) Неужели никто не пользуется такими вещами? Даже typeScript генерирует классы по почти такойже обертке. |
tsigel, увы пользуются. :(
Лучшеб действительно на тайпскрипт и подобное сразу переходили и не мучали js. |
Aetae,
Эта обертка ничуть не усложняет чтение кода. И с оберткой и без обертки можно писать как и читабельный и хороший код, так и страшный говнокод. Например сейчас я занимаюсь тем что переписываю говнокод за людьми которые не юзали никаких оберток. Это не им мешало написать много неподдерживаемого и малопонятного кода. И эта привычка людей плохо знакомых с ООП писать прототип родителя в ключик "superClass" чтобы пользовать переопределенные методы с помощью this.superClass.someMethod просто вымораживает. Самое смешное когда они наследуются дважды. Обертки такого рода убирают саму возможность такого рукожопства и придают единую стилистику кода. |
Цитата:
|
Sweet,
Я вообщем-то не живу в "иллюзорном" мире) Сборка и минификация - это совершенно другая тема мало связанная с текущей. Есть gulp и grunt. Requierjs тоже умеет собирать зависимости в 1 файлик. Вопрос лишь в самом удобстве создания этого приложения. Минификация - это подготовка к продакшену. И кстати мы на брудершафт не пили. Не нравится - так и скажи. А лучше объясни почему. Я готов к конструктивному диалогу. |
tsigel, поменьше общайся с рукожопыми. А то возомнишь себя супергением:D
|
Цитата:
|
Лучше пользоваться транслятором ES6 и писать в нативном JS синтаксисе.
class Foo { constructor() { ... } } class Bar extends Foo { constructor() { super(); ... } } Цитата:
|
Цитата:
А скажите, как вы наследуетесь в своем приложении? Каждый раз копируете 3 строки которые есть почти в каждом файле? Т.к. в большом приложении почти все объекты - наследники. Не зря же сделали доки @class которые работают с обертками. |
Ладно, я понял что обертка - боян. Простите что отнял у вас время.
|
Цитата:
Шучу, конечно. Просто не могу говорить на эту тему: а то меня расстреляют за разглашение секретной инфы!:) |
Цитата:
только дескрипторы не исопльзую вот и все наследование (по сути) Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 02:29. |