Last active
October 1, 2016 17:00
-
-
Save meew0/ec9f91672a78e316bb7fb9ee60a24864 to your computer and use it in GitHub Desktop.
Ruby's DelegateClass, implemented in ES6
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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