Code Monkey home page Code Monkey logo

js-class-is's Introduction

class-is

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

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(radius);
    }

    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(radius);
    }

    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

js-class-is's People

Contributors

fsdiogo avatar satazor avatar

Watchers

James Cloos avatar 杨明明 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.