Skip to content

Instantly share code, notes, and snippets.

@Swimburger
Last active October 26, 2016 14:49
Show Gist options
  • Save Swimburger/fa44ba9d7d8c9176c48caa89c8058569 to your computer and use it in GitHub Desktop.
Save Swimburger/fa44ba9d7d8c9176c48caa89c8058569 to your computer and use it in GitHub Desktop.
How to have private instance variables in an ES2015 Class
function on(key, listener){
addEventListener(this.events, key, listener);
}
function off(key, listener){
if(listener) removeEventListener(this.events, key, listener);
else removeEventListeners(this.events, key);
}
function emit(key, eventArgs){
for(let listener of this.events[key]){
listener(eventArgs);
}
}
function addEventListener(events, key, listener){
//if a listenersArray is stored for specific key, push the new listener on array, else create new array containing the listener for specific key
events[key] ? events[key].push(listener) : events[key] = [listener];
}
function removeEventListener(events, key, listener){
let index = events[key].indexOf(listener);
if(index > -1) events.splice(index, 1);
}
function removeEventListeners(events, key){
events[key] = [];
}
class EventEmitter{
constructor(){
//privateMembers is not accessible for the client using EventEmitter class
let privateMembers = {events: {}};
this.on = on.bind(privateMembers);
this.off = off.bind(privateMembers);
this.emit = emit.bind(privateMembers);
}
}
let myEventEmitter = new EventEmitter();
myEventEmitter.on("add", (eventArgs) => console.log(eventArgs));
myEventEmitter.emit("add", "hello added");
// output is "hello added"
myEventEmitter.off("add");
myEventEmitter.emit("add", "hello added");
// eventListener is not triggered because it is removed
console.log(myEventEmitter);
let myOtherEventEmitter = new EventEmitter();
myEventEmitter.on("add", (eventArgs) => console.log(eventArgs));
myEventEmitter.emit("add", "hello added 2");
// output is "hello added 2"
myEventEmitter.off("add");
myEventEmitter.emit("add", "hello added 2");
// eventListener is not triggered because it is removed
console.log(myOtherEventEmitter);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment