node-callable-instance
This module allows you to create an ES6 class that is callable as a function. The invocation is sent to one of the object's normal prototype methods.
Installation
npm install callable-instance
Usage
ExampleClass
instances have all of the normal properties and methods, but are actually functions as well.
var CallableInstance = require("callable-instance");
class ExampleClass extends CallableInstance {
constructor() {
super("instanceMethod");
}
instanceMethod() {
console.log("instanceMethod called!");
}
}
var test = new ExampleClass();
test.instanceMethod();
test();
test.apply(null, [1, 2, 3]);
For TypeScript, you need to supply the arguments and return value of the function. Note that the types specified may differ from the argument and return value types of the target method; this is an error due to a limitation of TypeScript.
import * as CallableInstance from "callable-instance";
class ExampleClass extends CallableInstance<[number], string> {
constructor() {
super("instanceMethod");
}
instanceMethod(input: number): string {
return `${input}`;
}
}
Inherited Properties
All instances of CallableMethod are also an instances of Function, and have all of Function's properties.
Libraries that accept functions will expect that they behave as Function objects do. For example, if you alter the semantics of the call
or apply
methods, library code may fail to work with your callable instance. In these cases, you can simply bind the instance method to the callable instance and pass that instead (e.g. test.instanceMethod.bind(test)
).
This can also cause problems if your derived class wants to have a name
or length
property, which are built-in properties and not configurable by default. You can have your class disable the built-in descriptors of these properties to make them available for your use.
var test = new ExampleClass();
test.name = "hello!";
console.log(test.name);
class NameableClass extends CallableInstance {
constructor() {
super("instanceMethod");
Object.defineProperty(this, "name", {
value: void 0,
enumerable: true,
writeable: true,
configurable: true,
});
}
instanceMethod() {
console.log(this.name);
}
}
test = new NameableClass();
test.name = "hello!";
console.log(test.name);
Contributing
- Fork it!
- Create your feature branch:
git checkout -b my-new-feature
- Commit your changes:
git commit -am 'Add some feature'
- Push to the branch:
git push origin my-new-feature
- Submit a pull request :D
Credits
Information for the implementation came from this StackOverflow answer.
License
Distributed under the MIT license.