Creates a function instance with specified name and length and prototype. Essentially, it's everything that you need to subclass the ECMAscript Function built-in type.
You use the function-class/invoke Symbol to define the logic that will be executed when the created function instance is invoked.
Install with npm:
$ npm install function-classOne-off:
varcreateFunction=require('function-class');varinvoke=require('function-class/invoke');varfn=createFunction('theName',6);assert.equal(fn.name,'theName');assert.equal(fn.length,6);fn[invoke]=function(arg){returnthis.name+' '+this.length+' '+arg;};assert.equal('theName 6 foo',fn('foo'));Subclass:
varinherits=require('util').inherits;varcreateFunction=require('function-class');varinvoke=require('function-class/invoke');functionFunctionSubclass(foo){if(typeofthis!=='function')returncreateFunction('subclass',0,FunctionSubclass,arguments);this.foo=foo;assert.equal(typeofthis,'function');assert.ok(thisinstanceofFunctionSubclass);}inherits(FunctionSubclass,Function);FunctionSubclass.prototype[invoke]=function(){returnthis.foo;}// usagevarf=newFunctionSubclass('foo');assert.equal(f.name,'subclass');assert.equal(f.length,0);assert.equal(f(),'foo');The main export is the createFunction() function, which returns a new Function instance.
- name -
String- thenameto set for the created function, must be a string (even containing spaces, unicode, emoji, or otherwise invalid JS identifier characters) - arity -
Number- thelengthto set for the created function, must be a positive integer - constructor -
Function- the class constructor to use invoke on the created instance, and inherit from theprototypeof - arguments -
Array- array of values to invokeconstructorwith
All arguments are optional. You must specify the invoke function to execute on the created function instance.
varcreateFunction=require('function-class');// inherits from Functionvarfn=createFunction('foo',3);// inherits from FunctionSubclass with constructors invoked with argsvarargs=['foo','bar'];varfn=createFunction('name',0,FunctionSubclass,args);You use the invoke Symbol to define the function to execute when a created function instance is invoked.
Note that this in the invoke function is bound to the created function instance when invoked without a receiver (i.e. "globally"). Otherwise, this respects the left-hand receiver, or target when used with .call()/.apply().
varinvoke=require('function-class/invoke');fn[invoke]=function(){console.log('fn has been invoked!');returnthis;};fn();// fn has been invoked!assert.equal(fn(),fn);assert.equal(fn.call(global),global);