2017-05-12 44 views
0

我想爲對象B在未來訂閱事件不是一個對象的發射,但是,我不想給對象B本身傳遞給A,因爲另一名開發人員的潛力(或自己)在A中濫用B的存在,並且因此緊密地耦合這兩個項目。有沒有一種方法可以只將B的事件發射器方面傳遞給A,以便A可以接收來自(即讀取)B的事件,但不能操作(即寫入)B?如何僅共享* node.js中對象的事件?

一個稍微簡單的解決方案,我能想到的是創建一個新的EventEmitter C,然後訂閱C到B的所有事件,發出相同的事件處理程序,然後傳給C到A.

是有一個更簡單的解決方案?

回答

0

的常用術語,你問的是一個代理。

您創建一個新的對象。只給你想要公開的方法。在一個私人封閉,你有實際eventEmitter對象,並要公開只需實際eventEmitter對象進行操作的一些方法,但沒有人能夠訪問只有代理可以修改實際eventEmitter對象或使用該發射器的任何方法是你沒有在代理中顯式公開。這裏有一個簡單的例子,只是通過代理使用.on()方法(發射器上沒有其他方法可以被調用)。

class EmitterProxy { 
    constructor(emitter) { 
     // add method that has access to emitter 
     this.on = function(event, fn) { 
      let self = this; 
      return emitter.on(event, function() { 
       // this makes sure that the value of this is the EmitterProxy 
       // instance and not the emitter instance 
       fn.apply(self, arguments); 
      }); 
     } 

     // define any other methods you want to proxy 
    } 
} 

然後,在您的代碼中,創建代理並將其傳遞給實際的eventEmitter。然後,您可以與任何你想要的人分享代理對象。他們可以聽取事件,但他們不能對發射器本身做任何事情。

let proxy = new EmitterProxy(actualEmitter); 

然後通過代理其他代碼,其中僅有權訪問的一種方法。

// other code can do this 
proxy.on('finish',() => { /* do something here */ });