JavaScript调解器模式;组件名称未定义

问题描述:

在调解器模式的以下实现中,为什么initialize方法中的this.name始终未定义?因为我期待它成为TestObject。我怎样才能做到这一点?JavaScript调解器模式;组件名称未定义

另外我如何创建TestObject的新实例?

Mediator = function() { 

     var debug = function() { 
      // console.log or air.trace as desired 
     }; 

     var components = {}; 

     var broadcast = function(event, args, source) { 
      var e = event || false; 
      var a = args || []; 
      if (!e) { 
       return; 
      } 
      //debug(["Mediator received", e, a].join(' ')); 
      for (var c in components) { 
       if (typeof components[c]["on" + e] == "function") { 
        try { 
         //debug("Mediator calling " + e + " on " + c); 
         var s = source || components[c]; 
         components[c]["on" + e].apply(s, a); 
        } catch (err) { 
         debug(["Mediator error.", e, a, s, err].join(' ')); 
        } 
       } 
      } 
     }; 

     var addComponent = function(name, component, replaceDuplicate) { 
      if (name in components) { 
       if (replaceDuplicate) { 
        removeComponent(name); 
       } else { 
        throw new Error('Mediator name conflict: ' + name); 
       } 
      } 
      components[name] = component; 
     }; 

     var removeComponent = function(name) { 
      if (name in components) { 
       delete components[name]; 
      } 
     }; 

     var getComponent = function(name) { 
      return components[name] || false; 
     }; 

     var contains = function(name) { 
      return (name in components); 
     }; 

     return { 
      name  : "Mediator", 
      broadcast : broadcast, 
      add  : addComponent, 
      rem  : removeComponent, 
      get  : getComponent, 
      has  : contains 
     }; 
    }(); 


    // Components  
    Mediator.add('TestObject', function() { 

     var someNumber = 0; // sample variable 
     var someString = 'another sample variable'; 

     return { 
      onInitialize: function() { 
       // this.name is automatically assigned by the Mediator 
       alert(this.name + " initialized."); 
      }, 
      onFakeEvent: function() { 
       someNumber++; 
       alert("Handled " + someNumber + " times!"); 
      }, 
      onSetString: function(str) { 
       someString = str; 
       alert('Assigned ' + someString); 
      } 
     } 
    }()); 

    Mediator.broadcast("Initialize");     
    Mediator.broadcast('FakeEvent');     
    Mediator.broadcast('SetString', ['test string']); 
    Mediator.broadcast('FakeEvent');     
    Mediator.broadcast('SessionStart'); 

这是因为在你返回函数集团,this代表集团本身,而不是中介对象(你可以在onInitialize尝试console.log(this);看到)。

编辑

为了一个名字组件添加到您的回调,你可以做这样的事情

var addComponent = function(varName, component, replaceDuplicate) { 
    if (varName in components) { 
     if (replaceDuplicate) { 
      removeComponent(varName); 
     } else { 
      throw new Error('Mediator name conflict: ' + varName); 
     } 
    } 
    components[varName] = component; 
    components[varName].name = varName; 
}; 

有很多的名字,所以我改变了当地namevarName

+0

我以为this.name应该让我“TestObject”? – XGreen

+1

“name”不是作为回调函数的对象的值。事实上,名称甚至不是Mediator的一个属性,它仅仅是一个局部变量,用于传输将用于定义'components [name]'的字符串。请参阅编辑的答案以访问名称变量。 –

+0

对不起,你还介意帮助我创建另一个TestObject的实例? – XGreen