In ECMAScript 6 the typeof
of classes is, according to the specification, \'function\'
.
However also according to the specification you are
You can use new.target to determine whether whether its instantiated by ES6 class function or function constructor
class Person1 {
constructor(name) {
this.name = name;
console.log(new.target) // => // => [Class: Person1]
}
}
function Person2(){
this.name='cc'
console.log(new.target) // => [Function: Person2]
}
Looking at the compiled code generated by Babel, I think there is no way you can tell if a function is used as a class. Back in the time, JavaScript didn't have classes, and every constructor was just a function. Today's JavaScript class keyword don't introduce a new concept of 'classes', it's rather a syntax sugar.
ES6 code:
// ES6
class A{}
ES5 generated by Babel:
// ES5
"use strict";
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var A = function A() {
_classCallCheck(this, A);
};
Of course, if you are into coding conventions, you could parse the function (the class), and check if it's name starts with a capital letter.
function isClass(fn) {
return typeof fn === 'function' && /^(?:class\s+|function\s+(?:_class|_default|[A-Z]))/.test(fn);
}
EDIT:
Browsers which already support the class keyword can use it when parsing. Otherwise, you are stuck with the capital letter one.
EDIT:
As balupton pointed out, Babel generates function _class() {}
for anonymous classes. Improved regex based on that.
EDIT:
Added _default
to the regex, to detect classes like export default class {}
BabelJS is heavily under development, and there is no guarantee they will not change the default function names in these cases. Really, you shouldn't rely on that.