Rename a given function. Tries to be cross-platform and guaranteed. Useful when you want to preserve name of bound function. In bonus, allows passing context to the renamed function.
Install
npm i rename-function --save
How it works? Strategy. Name priority.
There's a couple of things that you should be aware off and make your attention, few scenarios - you can do few things with package like this - rename function, binding function with context and both together.
- Just rename given
fn
to have name
instead of original name. - Throw
TypeError
if given fn
not a function. - If only
fn
is given, it is returned without modifications - nothing done. - If
fn
is given and falsey name
(meaning non-string) - just returns the fn
- nothing done. - If
fn
is given and name
is same as original name - just returns the fn
- nothing done. - If
fn
, name
and ctx
is given, and name
is as original - returns function with ctx
and same name. - If
fn
and ctx
is given, then function remains the same - only ctx
is bound.
Meaning, this package try to follow native behaviours. Because you can't do such thing
function zooparks () { return this }
var boundOne = renameFunction(zooparks, {foo: 'one'})
var boundTwo = renameFunction(boundOne, {foo: 'two'})
var boundZzz = renameFunction(boundTwo, {foo: 'zzz'})
console.log(boundZzz())
and expect boundZzz()
to return {foo: 'zzz'}
, it would be {foo: 'one'}
always. It's still a bit strange even to me, because of use the thing that I call "smart binding" with which I tried to solve this problem and will continue. Kinda strange, when debugging it seems it shows expected results. But in other hand that's the native behaviour, see this one:
function zooparks () { return this }
var boundOne = zooparks.bind({foo: 'one'})
var boundTwo = boundOne.bind({foo: 'two'})
var boundZzz = boundTwo.bind({foo: 'zzz'})
console.log(boundZzz())
Usage
For more use-cases see the tests
const renameFunction = require('rename-function')
Rename given fn
with name
. If given name
is same as old, then the fn
is just returned earlier, nothing more is done.
Params
fn
{Function}name
{String|Object}ctx
{Object}returns
{Function}: or throws TypeError
if fn
not a function
Example
var rename = require('rename-function')
var getName = require('get-fn-name')
var fn = rename(fixture () {}, 'abc')
console.log(getName(fn))
console.log(fn.name)
var bound = rename(fixture foo () { return this }, 'zoo', {a: 'b'})
console.log(bound())
console.log(bound.name)
console.log(getName(bound))
Related
Contributing
Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.
But before doing anything, please read the CONTRIBUTING.md guidelines.