Skip to content

Instantly share code, notes, and snippets.

@meew0
Last active October 1, 2016 17:00
Show Gist options
  • Save meew0/ec9f91672a78e316bb7fb9ee60a24864 to your computer and use it in GitHub Desktop.
Save meew0/ec9f91672a78e316bb7fb9ee60a24864 to your computer and use it in GitHub Desktop.
Ruby's DelegateClass, implemented in ES6
// See http://ruby-doc.org/stdlib-2.3.1/libdoc/delegate/rdoc/Object.html for more information
// Some example classes...
class User {
constructor(username) {
this.username = username;
}
}
class Server {
constructor(id) {
this.id = id;
}
}
// This is where the magic happens
class DelegateClass {
constructor(target) {
function _generateDelegationHandler(_target) {
return {
get: function(__target, name) {
return name in __target
? __target[name]
: name in _target
? _target[name]
: undefined;
}
};
}
this._delegate = new Proxy(this, _generateDelegationHandler(target));
}
}
// Note that, unlike in Ruby, you don't need to specify the delegation target type.
class Member extends DelegateClass {
constructor(user, server) {
// Initialise the DelegateClass, like you would in Ruby
super(user);
// Do other initialisation steps
this.user = user;
this.server = server;
// This is required
return this._delegate;
}
get serverID() {
return this.server.id;
}
}
var izy = new User("izy521");
console.log(izy.username);
var discordAPI = new Server("81384788765712384");
var izyMember = new Member(izy, discordAPI);
console.log(izyMember.serverID);
console.log(izyMember.username);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment