All Projects → moxystudio → js-class-is

moxystudio / js-class-is

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

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to js-class-is

is-symbol
Is this an ES6 Symbol value?
Stars: ✭ 16 (-5.88%)
Mutual labels:  is
is-dotfile
Return true if the file is (or the file path has) a dotfile.
Stars: ✭ 13 (-23.53%)
Mutual labels:  is
php-helpers
An extensive set of PHP helper functions and classes.
Stars: ✭ 27 (+58.82%)
Mutual labels:  class
metrics
IS, FID score Pytorch and TF implementation, TF implementation is a wrapper of the official ones.
Stars: ✭ 91 (+435.29%)
Mutual labels:  is
checkif.js
Javascript check library
Stars: ✭ 30 (+76.47%)
Mutual labels:  is
collaboration
Spring '20 IoT - systems and security class. This is the collaborative half of the class.
Stars: ✭ 14 (-17.65%)
Mutual labels:  class
dotfiles
Some items in /home/kiedtl/etc
Stars: ✭ 49 (+188.24%)
Mutual labels:  is
java-class-tools
Read and write java class files in Node.js or in the browser.
Stars: ✭ 27 (+58.82%)
Mutual labels:  class
is-negative-zero
Is this value negative zero? === will lie to you.
Stars: ✭ 16 (-5.88%)
Mutual labels:  is
methodtools
Expand functools features(lru_cache) to class - methods, classmethods, staticmethods and even for (unofficial) hybrid methods.
Stars: ✭ 57 (+235.29%)
Mutual labels:  class
Toxiproxy
⏰ 🔥 A TCP proxy to simulate network and system conditions for chaos and resiliency testing
Stars: ✭ 7,529 (+44188.24%)
Mutual labels:  is
FoxBarcode
A 100% Visual FoxPro class that provides a tool for generating images with different bar code symbologies to be used in VFP forms and reports, or exported to other applications
Stars: ✭ 31 (+82.35%)
Mutual labels:  class
php-libtgvoip
PHP extension that wraps the telegram VoIP library.
Stars: ✭ 22 (+29.41%)
Mutual labels:  class
is-arrow-function
Determine if a function is an ES6 arrow function or not.
Stars: ✭ 20 (+17.65%)
Mutual labels:  is
FoxBarcodeQR
FoxBarcodeQR is a supplement of FoxBarcode class only for QR Code barcodes. This class is an alternative solution for all developers who requested QR Code support.
Stars: ✭ 20 (+17.65%)
Mutual labels:  class
is-regex
Is this value a JS regex?
Stars: ✭ 22 (+29.41%)
Mutual labels:  is
DTE
Generate C# class from database table
Stars: ✭ 26 (+52.94%)
Mutual labels:  class
NamingThings
Content on tips, tricks, advice, practices for naming things in in software/technology
Stars: ✭ 31 (+82.35%)
Mutual labels:  class
nstate
A simple but powerful react state management library with low mind burden
Stars: ✭ 11 (-35.29%)
Mutual labels:  class
flutter-stylizer
Flutter Stylizer is a VSCode extension that organizes your Flutter classes and mixins in an opinionated and consistent manner.
Stars: ✭ 23 (+35.29%)
Mutual labels:  class

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

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].