我想爲對象B在未來訂閱事件不是一個對象的發射,但是,我不想給對象B本身傳遞給A,因爲另一名開發人員的潛力(或自己)在A中濫用B的存在,並且因此緊密地耦合這兩個項目。有沒有一種方法可以只將B的事件發射器方面傳遞給A,以便A可以接收來自(即讀取)B的事件,但不能操作(即寫入)B?如何僅共享* node.js中對象的事件?
一個稍微簡單的解決方案,我能想到的是創建一個新的EventEmitter C,然後訂閱C到B的所有事件,發出相同的事件處理程序,然後傳給C到A.
是有一個更簡單的解決方案?
我想爲對象B在未來訂閱事件不是一個對象的發射,但是,我不想給對象B本身傳遞給A,因爲另一名開發人員的潛力(或自己)在A中濫用B的存在,並且因此緊密地耦合這兩個項目。有沒有一種方法可以只將B的事件發射器方面傳遞給A,以便A可以接收來自(即讀取)B的事件,但不能操作(即寫入)B?如何僅共享* node.js中對象的事件?
一個稍微簡單的解決方案,我能想到的是創建一個新的EventEmitter C,然後訂閱C到B的所有事件,發出相同的事件處理程序,然後傳給C到A.
是有一個更簡單的解決方案?
的常用術語,你問的是一個代理。
您創建一個新的對象。只給你想要公開的方法。在一個私人封閉,你有實際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 */ });