我希望对象B订阅事件而不是对象A发出 - 但是,我不想将对象B本身传递给A,因为有可能是另一个开发人员(或者我自己未来)滥用B中B的存在,从而将这两个项目紧密结合在一起。有没有办法我只能将B的事件发射器方面传递给A,这样A可以从(即读取)B接收事件,但不能操纵(即写入)B?
我能想到的一个简单的解决方案是创建一个新的EventEmitter C,然后将C订阅到B的所有事件,处理程序发出相同的事件,然后将C传递给A.
是否有更简单的解决方案?
答案 0 :(得分: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 */ });