1.1.0 • Published 7 years ago

class-is v1.1.0

Weekly downloads
107,591
License
MIT
Repository
github
Last release
7 years ago

class-is

NPM version Downloads Build Status Coverage Status Dependency status Dev Dependency status Greenkeeper badge

Enhances a JavaScript class by adding an is<Class> property to compare types between realms.

Motivation

Checking if a value is an instance of a class in JavaScript is not an easy task.

You can use instanceof, but that doesn't work between different realms or different versions. Comparing with constructor.name could be a solution but if you need to Uglify the module it doesn't work, as it creates different names for the same module.

Symbols to the rescue!

Installation

$ npm install class-is

If you want to use this module in the browser you have to compile it yourself to your desired target.

Usage

ES6 classes:

// Package X
const withIs = require('class-is');

class Person {
    constructor(name, city) {
        this.name = name;
        this.city = city;
    }
}

module.exports = withIs(Person, {
    className: 'Person',
    symbolName: '@org/package-x/Person',
});
// Package Y
const withIs = require('class-is');

class Animal {
    constructor(species) {
        this.species = species;
    }
}

module.exports = withIs(Animal, {
    className: 'Animal',
    symbolName: '@org/package-y/Animal',
});
const Person = require('package-x');
const Animal = require('package-y');

const diogo = new Person('Diogo', 'Porto');
const wolf = new Animal('Gray Wolf');

console.log(Person.isPerson(diogo));
console.log(Person.isPerson(wolf));

Running the example above will print:

true
false

ES5 and below classes:

In ES5 it's not unusual to see constructors like the one below, so you can call it without using the new keyword.

function Circle(radius) {
    if (!(this instanceof Circle)) {
        return new Circle();
    }

    this.radius = radius;
}

In such cases you can use the withIs.proto method:

const withIs = require('class-is');

const Circle = withIs.proto(function (radius) {
    if (!(this instanceof Circle)) {
        return new Circle();
    }

    this.radius = radius;
}, {
    className: 'Circle',
    symbolName: '@org/package/Circle',
});

...or even better:

const withIs = require('class-is');

function Circle(radius) {
    this.radius = radius;
}

module.exports = withIs.proto(Circle, {
    className: 'Circle',
    symbolName: '@org/package/Circle',
    withoutNew: true,
});

API

withIs(Class, { className, symbolName })

class

Type: class

The class to be enhanced.

className

Type: String

The name of the class your passing.

symbolName

Type: String

Unique id for the class. This should be namespaced so different classes from different modules do not collide and give false positives.

Example: @organization/package/Class

withIs.proto(Class, { className, symbolName, withoutNew })

The className and symbolName parameters are the same as above.

withoutNew

Type: Boolean
Default: false

Allow creating an instance without the new operator.

Tests

$ npm test
$ npm test -- --watch during development

License

MIT

@everything-registry/sub-chunk-1332@compendia/ipfs-core@compendia/libp2p-commonjs@borealisswap/borealis-swap-libjs-swrm-clientjs-swrm-client-betajs-swrm-client-testjs-swrm-client-videoipld-lfcipld-lfc-txipfs-vueipfs-blockknightxv-libp2p@arve.knudsen/libp2p-switch@arve.knudsen/peer-id@afria/afria-libraries@chakra-swap/core@bonsaiswap-lib/lib@bonsaiswapv3/core@bonsaiswapv3/deploy@deconet/libp2p-webrtc-directxs-js-ipfs-blockxs-js-libp2p-tcpxs-js-libp2p-websocketsxs-js-multiaddrzona-x@dstack-js/transport@idn/libp2p-webrtc-star@galtproject/js-ipfs@eliteswap/v2-core@innoswap/core@ipld/block@ipld/generics@ipld/types@lit-protocol/libp2p-webrtc-direct@materia-dex/materia-contracts-proxy@nirin100/quadratic-protocol@nirin100/quadratic-sdk@nodeberry/solidity-payment-processor@mdip/libp2p@jimpick/cids@kodinghandle/bullswap-lib@olympfin/olymp-swap-libmini-ipfssan-sdk.jssan-sdk-crosssdk-test.jspixiu-swap-corepixiuswap-libs-sdkpeer-idqudratic-uiquadratic-sdkshowgalleryinterface-connectioninstaller-test-malware-client-2little-pubsublibp2p-websocketslibp2p-websockets-curltechlibp2p-websockets-curltechtestlibp2p-websocket-starlibp2p-stardustlibp2p-switchlibp2p-tcplibp2p-webrtc-circuitlibp2p-webrtc-directlibp2p-webrtc-starloading-animated@xmader/ipfs-core@xstorage/xs-js-ipld-dag-pb@xstorage/xs-js-libp2p-tcp@xstorage/xs-js-libp2p-webrtc-star@xstorage/xs-js-libp2p-websockets@xswap/v2-core@yak-spirit/yak-swap-ui@zalastax/nolb-clas@sudophunk/fulidochained-configdate-to-block-ethdynamics-contracts-xeaquererumenefti-galerieth-libp2p-switcheth-libp2p-webrtc-stareth-libp2p-websocket-stareth-peer-idgassefalsgassefals-2
1.1.0

7 years ago

1.0.0

7 years ago

0.5.1

7 years ago

0.5.0

7 years ago

0.4.0

7 years ago

0.3.1

7 years ago

0.3.0

7 years ago

0.2.1

7 years ago

0.2.0

7 years ago