如何区分一个类对象的function?

我有一个js对象,可能是一个函数或类,即。 它等于以下之一:

class { constructor( param ) { } onCreate() { } }; 

要么,

 function ( param ) { }; 

原来他们有更多的共同点,我期望(例如,都有一个构造函数)。 请告诉我最简单的方法来确定我的js对象引用这些types中的哪一个。

该解决scheme必须在节点4.3.2中工作。

编辑:为了澄清,我试图区分的对象是一个类或函数,而不是这些的一个实例。 是的,我知道一个class级只是碳酸糖,这是很难的。

我用v6.9.2在REPL中得到这个:

 λ node -i > class A {} [Function: A] > let B = function() {} undefined > A.toString() 'class A {}' > B.toString() 'function () {}' 

可能还有另一种更可靠的方法,但是检查class应该是可行的:

 if (A.toString().match(/^class/)) { // it's a class } 

一个class在JavaScript规范中并不是一个“真实的东西”,除了已经存在的语言原语的组合之外,还有一些语法糖。

供应商可能会做出区分(例如在另一个答案中提到的toString方法),但是我已经扫描了这个规范,我不认为这是它的一部分…所以是供应商定义的,因此不能被依赖。

事实上:当在一个class上使用toString时,Mac上的Firefox 50不打印“class”(它使用“function”一词)这个词。

我不太了解JS类,所以我可能是错的…

我认为值得补充的是,如果知道类或函数的名称,可以像这样区分它们。

 > const C = class CC { }; undefined > const F = function FF() { }; undefined > C.prototype CC {} > F.prototype FF {} 

如果他们是匿名的(不确定在js中是否使用了这个术语),那么你只需要“{}”。

在一个程序中,你可以使用util.inspect(名字部分与toString消失)来获得这些string。

这类问题的答案几乎总是Lodash(或Underscore)。 Lodash有function :

检查值是否被分类为一个Function对象。

人们总是试图重新创造一个东西在Lodash吨。 罗达什肯定是正确的做法,而且维护得很好。

道德故事:在你写一个函数做X之前,检查Lodash是否做X.

 coffee> ld.isFunction [Function: isFunction] coffee> ld.isFunction(Date) true coffee> a = b:2 { b: 2 } coffee> ld.isFunction(a) false coffee> coffee> d = new Date() 2016-12-17T00:02:58.950Z coffee> ld.isFunction(d) false