Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.12.2014, 06:54
Профессор
Посмотреть профиль Найти все сообщения от __он_самый__
 
Регистрация: 22.11.2014
Сообщений: 130

Знаменитая функция Class учавствует в фреймворке ui2/0
поддерживается приватные свойства, статические свойства, протектед свойства, и наследование.
вот её реализация для ui:



wrapMethod = function(method, parentMethod, privatePrefix, Class) {
      var wrapper;
      wrapper = function() {
        var privateBk, returns, staticBk, superBk;
        superBk = this["super"];
        privateBk = this["private"];
        staticBk = this["static"];
        if (this['__privates__']) {
          if (!this['__privates__'][privatePrefix]) {
            this['__privates__'][privatePrefix] = Object.create(null);
          }
          this["private"] = this['__privates__'][privatePrefix];
        }
        this["super"] = parentMethod;
        this["static"] = Class;
        returns = method.apply(this, arguments);
        this["super"] = superBk;
        this["private"] = privateBk;
        this["static"] = staticBk;
        return returns;
      };
      wrapper.toString = function() {
        return method.toString();
      };
      return wrapper;
    };

extend = function(Parent, Child) {
      var Class, descriptor, emptyFuncRegExp, get, key, method, newPrototype, parentMethod, privatePrefix, set, value, wrapper, _i, _len, _ref;
      if (!Child) {
        Child = Parent;
        Parent = Object;
      }
      if (!Parent) {
        Parent = Object;
      }
      if (typeof Parent === 'string') {
        Parent = ui.controller(Parent);
      }
      Class = function() {
        var constructor, returns;
        if (!this.hasOwnProperty('super')) {
          Object.defineProperty(this, 'super', {
            writable: true
          });
        }
        if (!this.hasOwnProperty('private')) {
          Object.defineProperty(this, 'private', {
            writable: true
          });
        }
        if (!this.hasOwnProperty('static')) {
          Object.defineProperty(this, 'static', {
            writable: true
          });
        }
        if (!this.hasOwnProperty('__privates__')) {
          Object.defineProperty(this, '__privates__', {
            value: Object.create(null)
          });
        }
        constructor = Class.prototype.constructor;
        returns = constructor.apply(this, arguments);
        if (returns instanceof constructor && !(returns instanceof Class)) {
          return this;
        }
        if (returns === Object(returns)) {
          return returns;
        } else {
          return this;
        }
      };
      privatePrefix = Math.random()+''
      newPrototype = Object.create(Parent.prototype);
      emptyFuncRegExp = /^function\s*\S*\s*\(.*?\)\s*\{\s*}$/img;
      _ref = Object.getOwnPropertyNames(Child.prototype);
      for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        key = _ref[_i];
        if (!Child.prototype.hasOwnProperty(key)) {
          continue;
        }
        descriptor = Object.getOwnPropertyDescriptor(Child.prototype, key);
        method = descriptor.value;
        set = descriptor.set;
        get = descriptor.get;
        if (typeof method === 'function') {
          if (key === 'constructor' && emptyFuncRegExp.test(method)) {
            continue;
          }
          parentMethod = Parent.prototype[key];
          wrapper = wrapMethod(method, parentMethod, privatePrefix, Class);
          descriptor.value = wrapper;
        }
        if (typeof set === 'function') {
          descriptor.set = wrapMethod(set, void 0, privatePrefix, Class);
        }
        if (typeof get === 'function') {
          descriptor.get = wrapMethod(get, void 0, privatePrefix, Class);
        }
        Object.defineProperty(newPrototype, key, descriptor);
      }
      Class.prototype = newPrototype;
      for (key in Child) {
        if (!__hasProp.call(Child, key)) continue;
        value = Child[key];
        Class[key] = value;
      }
      Class.isClass = true;
      Class.toString = function() {
        return Class.prototype.constructor.toString();
      };
      return Class;
};










// #################### ПРИМЕР ИСПОЛЬЗОВАНИЯ ####################

function Animal(){
  this.private.name = 'Animal'
}

Animal.prototype.say = function(){
  alert(this.private.name)
}


function Cat(){
  this.super()
  this.private.name = 'Cat'
}

Cat.prototype.say = function(){
  this.super()
  alert(this.private.name)
}


// наследуем
Cat = extend(Animal, Cat)
cat = new Cat()

cat.say() // запускаем

Последний раз редактировалось __он_самый__, 24.12.2014 в 08:06.
Ответить с цитированием
  #2 (permalink)  
Старый 24.12.2014, 07:01
Профессор
Посмотреть профиль Найти все сообщения от __он_самый__
 
Регистрация: 22.11.2014
Сообщений: 130

прошу прощения, какой то баг, она как то странно ведет себя ВНЕ ui, минутку? разберемся, должно выводиться

alert(Animal)
alert(Cat)
Ответить с цитированием
  #3 (permalink)  
Старый 25.12.2014, 05:57
Профессор
Посмотреть профиль Найти все сообщения от __он_самый__
 
Регистрация: 22.11.2014
Сообщений: 130

удалите тему
Ответить с цитированием
  #4 (permalink)  
Старый 29.12.2014, 13:19
Аватар для Zend
Профессор
Отправить личное сообщение для Zend Посмотреть профиль Найти все сообщения от Zend
 
Регистрация: 28.11.2009
Сообщений: 328

придурок
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Унылого треша тред megaupload Оффтопик 648 17.06.2014 14:31
Как работает функция Class godofjavascript Оффтопик 58 17.12.2012 09:49