Skip to content

@lopatnov/callable

Latest
Compare
Choose a tag to compare
@lopatnov lopatnov released this 06 Aug 05:29
· 4 commits to master since this release

@lopatnov/callable

NPM version
License
Build Status
Twitter

Abstract class Callable is abstraction for creating new instances of a class as functions, not objects.

Install

https://nodei.co/npm/@lopatnov/callable.png?downloads=true&downloadRank=true&stars=true

npm install @lopatnov/callable

Browser

<script src="//lopatnov.github.io/callable/dist/callable.min.js"></script>

Import package to the project

TypeScript package import

import {
  Callable,
  CallableByCallee,
  CallableByClosure,
  CallableByProxy,
} from "callable";

JavaScript package import

var module = require("callable");
var Callable = module.Callable,
  CallableByCallee = module.CallableByCallee,
  CallableByClosure = module.CallableByClosure,
  CallableByProxy = module.CallableByProxy;

How to use

TypeScript usage

import { Callable } from "callable";

class ChildCallable extends Callable<string> {
  _call(...args: any[]): string {
    return `Hello ${args[0]}`;
  }
}

let x = new ChildCallable(); // <-- returns function
let xc = x("World");

console.log(xc); //Hello World

JavaScript usage

var m = require("@lopatnov/callable");
var Callable = m.Callable;

class ChildCallable extends Callable {
  _call(...args) {
    return `Hello ${args[0]}`;
  }
}

let x = new ChildCallable(); // <-- returns function
let xc = x("World");

console.log(xc); //Hello World

Description of abstract class Callable<TResult> and it's variations

Abstract class Callable has different realizations. They have different plus side and minus side.

The parameter TResult is a result type of a function.

abstract class Callable<TResult>

This is the function bind way.

Plus side

  • Doesn’t rely on deprecated or modern features.
  • No need to modify prototypes.

Minus side

  • Requires wrapping the function object in a bound function.

abstract class CallableByCallee<TResult>

Plus side

  • Very simple.
  • No need to modify prototypes.

Minus side

  • arguments and arguments.callee are unavailable in ‘strict mode’, see MDN for more.

abstract class CallableByProxy<TResult>

Plus side

  • Simple, native way to intercept calls and redirect them.
  • No need to modify prototypes.

Minus side

  • Requires wrapping objects created by Callable in a Proxy.
  • A small performance penalty for using Proxy handlers.

abstract class CallableByClosure<TResult>

Plus side

  • Requires no wrapping of the returned object with a Proxy or bind.

Minus side

  • Requires modifying prototypes.
  • Modifying prototypes is slow and has other side effects, see MDN.

Demo

See, how it's working: https://runkit.com/lopatnov/callable-demo

Test it with a runkit: https://npm.runkit.com/@lopatnov/callable

Changelog

Version Description
1.1.0 Updated packages due to GitHub security policy

Rights and Agreements

License Apache-2.0

Copyright 2019-2020 Oleksandr Lopatnov