Skip to content

Instantly share code, notes, and snippets.

@toddself
Created June 7, 2016 16:23

Revisions

  1. toddself created this gist Jun 7, 2016.
    31 changes: 31 additions & 0 deletions model-something.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,31 @@
    const EventEmitter = require('events')

    function ComputedModel (props) {
    const base = Object.create(new EventEmitter())
    const keys = Object.keys(props)
    for (let i = 0, len = keys.length; i < len; i++) {
    const key = keys[i]
    const prop = props[key]
    Object.defineProperty(base, `_${key}`, {writable: true, value: prop})
    if (typeof prop === 'function') {
    Object.defineProperty(base, key, {
    get: function () {
    return this[`_${key}`]()
    }
    })
    } else {
    Object.defineProperty(base, key, {
    enumerable: true,
    get: function () {
    return this[`_${key}`]
    },
    set: function (val) {
    this[`_${key}`] = val
    this.emit('set', {key: key, value: val})
    }
    })
    }
    }

    return base
    }