Модификация JavaScript фреймворк наследования


Я модифицировал Джон Резиг простой JavaScript, наследования рамок, добавив набор функций с сеттером функциональность. Похоже, что это работает. Это правильно написано? Вы можете увидеть некоторые нежелательное поведение? Основы:

(function(){
   var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
   this.Class = function(){};
   Class.extend = function(prop) {
     var _super = this.prototype;
    initializing = true;
    var prototype = new this();
    initializing = false;
    for (var name in prop) {
      prototype[name] = typeof prop[name] == "function" &&
        typeof _super[name] == "function" && fnTest.test(prop[name]) ?
        (function(name, fn){
          return function() {
            var tmp = this._super;
            this._super = _super[name];
            var ret = fn.apply(this, arguments);       
            // CHANGED HERE FROM this._super = tmp;
            // don't like some not used properties 
            if(tmp)this._super = tmp;
            // END OF CHANGE
            return ret;
          };
        })(name, prop[name]) :
        prop[name];
    }
    function Class() {
      if ( !initializing && this.init )
        this.init.apply(this, arguments);
    }
    Class.prototype = prototype;
    Class.prototype.constructor = Class;
    Class.extend = arguments.callee;

    // CHANGED HERE
    // Set method
    Class.prototype.set = function(attrs) {
      for (var attr in attrs) {
        //if exist setter function this.on_change{key of wrap: function(key of wrap, new value)
        if(this.on_change[attr])this.on_change[attr].call(this,attr,attrs[attr]);
        else this[attr] = attrs[attr];
      }
      return this;
    };
    if(!Class.prototype.on_change)Class.prototype.on_change={};
    // END OF CHANGE

    return Class;
  };
})();

Тестовый код:

var Person = Class.extend({
  a: 15,
  b: 30,
  init: function(){
      //...
  },
  on_change:{
      b: function(oldKey, set){this[oldKey] = set*2}
  }
});
var p = new Person();
p.set({a:25,b:40});


242
3
задан 7 декабря 2011 в 12:12 Источник Поделиться
Комментарии
1 ответ

Легкий вопрос первый : это написано правильно?

Class.prototype.set = function(attrs) {
for (var attr in attrs) {
//if exist setter function this.on_change{key of wrap: function(key of wrap, new value)
if(this.on_change[attr])this.on_change[attr].call(this,attr,attrs[attr]);
else this[attr] = attrs[attr];
}
return this;
};
if(!Class.prototype.on_change)Class.prototype.on_change={};


  • у attrs это не очень хорошее название, оно не содержит список атрибутов, но список из пары имя/значение, я бы посоветовал Спартанец о' объекта или может карту.

  • Опуская фигурные скобки в вашем случае, если заявление одобрено, удаление строк не так много

  • Одна строка комментария не очень полезно :\

  • Вы можете использовать следующее для инициализации on_change :
    Класс.прототип.on_change = класс.прототип.on_change || {};

  • on_change не lowerCamelCase -> onChange, после чего будет более идиоматические.

Я бы счетчик рекомендовать:

Class.prototype.set = function( map ){
for ( var attributeName in map ) {
var value = map[attributeName],
setter = this.onChange[attributeName];
if( setter )
setter.call( this, attributeName, value );
else
this[attributeName] = value;
}
return this;
};
Class.prototype.onChange = Class.prototype.onChange || {};

Трудный вопрос: Можете ли вы увидеть некоторое нежелательное поведение?

Да.


  1. Предоставление onChange, после это олдскул, реальные события использование метода addEventListener.

  2. Сейчас существует 2 способа изменить свойство, через установить и через изменение свойств напрямую. Сеттер функции работают только для набора, это повлечет возникновение ошибок.

  3. Вы рассчитываете на сеттера делать уступки другим возможным источником ошибки. Я хотел выполнить задание независимо от того, переименовать сеттер на слушателя , а затем выполнить слушателя:

    this[attributeName] = value;
    if( listener )
    listener.call( this, attributeName, value );

3
ответ дан 28 января 2014 в 01:01 Источник Поделиться