Enhances a JavaScript class by adding an is<Class> property to compare types between realms.
npm install class-is[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coverage Status][codecov-image]][codecov-url] [![Dependency status][david-dm-image]][david-dm-url] [![Dev Dependency status][david-dm-dev-image]][david-dm-dev-url] [![Greenkeeper badge][greenkeeper-image]][greenkeeper-url]
[npm-url]:https://npmjs.org/package/class-is
[downloads-image]:http://img.shields.io/npm/dm/class-is.svg
[npm-image]:http://img.shields.io/npm/v/class-is.svg
[travis-url]:https://travis-ci.org/moxystudio/js-class-is
[travis-image]:http://img.shields.io/travis/moxystudio/js-class-is/master.svg
[codecov-url]:https://codecov.io/gh/moxystudio/js-class-is
[codecov-image]:https://img.shields.io/codecov/c/github/moxystudio/js-class-is/master.svg
[david-dm-url]:https://david-dm.org/moxystudio/js-class-is
[david-dm-image]:https://img.shields.io/david/moxystudio/js-class-is.svg
[david-dm-dev-url]:https://david-dm.org/moxystudio/js-class-is?type=dev
[david-dm-dev-image]:https://img.shields.io/david/dev/moxystudio/js-class-is.svg
[greenkeeper-image]:https://badges.greenkeeper.io/moxystudio/js-class-is.svg
[greenkeeper-url]:https://greenkeeper.io/
Enhances a JavaScript class by adding an is property to compare types between realms.
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!
$ npm install class-is
If you want to use this module in the browser you have to compile it yourself to your desired target.
``js
// 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',
});
`
`js
// 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',
});
`
`js
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
In ES5 it's not unusual to see constructors like the one below, so you can call it without using the new keyword.
`js
function Circle(radius) {
if (!(this instanceof Circle)) {
return new Circle();
}
this.radius = radius;
}
`
In such cases you can use the withIs.proto method:
`js
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:
`js
const withIs = require('class-is');
function Circle(radius) {
this.radius = radius;
}
module.exports = withIs.proto(Circle, {
className: 'Circle',
symbolName: '@org/package/Circle',
withoutNew: true,
});
`
###### 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
The className and symbolName parameters are the same as above.
###### withoutNew
Type: Boolean false
Default:
Allow creating an instance without the new operator.
$ npm test $ npm test -- --watch` during development