Удобная обертка для создания классов с наследованием
Здравствуйте!
Предлагаю вашему вниманию удобную обертку для создания классов с наследованием:
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
|
| Часовой пояс GMT +3, время: 08:32. |