Показать сообщение отдельно
  #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".
Ответить с цитированием