Skip to content

Instantly share code, notes, and snippets.

@a-ono
Last active August 29, 2015 14:00
Show Gist options
  • Save a-ono/11081755 to your computer and use it in GitHub Desktop.
Save a-ono/11081755 to your computer and use it in GitHub Desktop.
ruby-like accessors in coffeescript
Function::getter = (name, getter) ->
getter ?= () -> @["_" + name]
Object.defineProperty @prototype, name, get: getter, configurable: true
Function::setter = (name, setter) ->
setter ?= (value) -> @["_" + name] = value
Object.defineProperty @prototype, name, set: setter, configurable: true
Function::accessor = (name, options) ->
{get: getter, set: setter, default: value} = options ? {}
@getter(name, getter)
@setter(name, setter)
@::["_" + name] = value if value?
class Person
@accessor "firstName", default: "foo"
@accessor "lastName", default: "bar"
@getter "name", () -> "#{@firstName} #{@lastName}"
person = new Person
console.log(person.name) #=> "foo bar"
person.firstName = "first"
person.lastName = "last"
console.log(person.name) #=> "first last"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment