sweetener
v1.0.2
Published
Add getters and setters to a function to connect it with an object
Readme
Sweetener
Inspired by Mike Bostock's Towards Reusable Charts, this function makes it easy to add "syntactic sugar" for getting and setting properties on a function.
Installation
On npm:
npm install sweetenerSweetener can be run in a browser by including sweetener.js. It is available as a global (sweetener) or via AMD.
Usage
Start with the function you wish to augment, and an object whose properties you wish to use:
var sweetener = require('sweetener') // For node.js
function fn () {}
var object = { hello: 'world', foo: 'bar' }Then call sweetener with the function and the object:
sweetener(fn, object)The object properties can now be accessed by called methods on the function that match the object key:
fn.foo() // 'bar'And they can be set by calling the method with a value:
fn.foo('baz')
fn.foo() // 'baz'Setters return the function itself and so can be chained:
fn.hello('hello').foo('baz')Why?
In Towards Reusable Charts, Mike Bostock advocates using nested functions like so:
function constructor () {
var width = 3
var height = 2
function chart () {
console.log(width, height)
// …
}
chart.width = function (_) {
if (!arguments.length) return width
width = _
return chart
}
chart.height = function (_) {
if (!arguments.length) return height
height = _
return chart
}
return chart
}
var chart = constructor()
chart() // render chart with a width: 3 and height: 2
chart.width(4).height(3)
chart() // render chart with a width: 4 and height: 3Writing getters and setters for each variable can get cumbersome, so sweetener can do the work for you:
function constructor () {
var props = {
width: 3,
height: 2
}
return sweetener(function chart () {
console.log(props.width, props.height)
// …
}, props)
}
var chart = constructor()
chart() // render chart with a width: 3 and height: 2
chart.width(4).height(3)
chart() // render chart with a width: 4 and height: 3License
Sweetener is copyright © 2016+ Dom Christie and released under the MIT license.
