Skip to content

Easy `Function` subclasses

License

Notifications You must be signed in to change notification settings

beatdigit/node-function-class

Repository files navigation

node-function-class

Easy Function subclasses

Build Status

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.

Installation

Install with npm:

$ npm install function-class

Examples

One-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');

API

The main export is the createFunction() function, which returns a new Function instance.

createFunction(name, arity, constructor, arguments) → Function

  • name - String - the name to set for the created function, must be a string (even containing spaces, unicode, emoji, or otherwise invalid JS identifier characters)
  • arity - Number - the length to 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 the prototype of
  • arguments - Array - array of values to invoke constructor with

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);

invoke → Symbol

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);

About

Easy `Function` subclasses

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • JavaScript100.0%