如何区分函数和类对象?

时间:2016-12-15 23:08:09

标签: javascript node.js

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

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

或者,

function ( param ) { };

事实证明他们有更多共同点,我预期(例如,两者都有一个构造函数)。请告诉我确定我的js对象引用哪些类型的最简单方法。

解决方案必须在节点4.3.2中工作。

编辑:为了澄清,我试图区分的对象是类或函数,而不是这些的实例。是的,我知道一个类只是合成糖,这就是让这很难的原因。

4 个答案:

答案 0 :(得分:2)

class不是真实的"在JavaScript规范中,除了作为预先存在的语言原语的组合的语法糖之外。

供应商可以区分可能(例如,在另一个答案中建议的toString方法),但我已经扫描了规范,我不认为这是其中的一部分......因此是供应商定义的因此不能依赖。

确实:Mac上的Firefox 50不打印“#34; class" (当toString上使用class时,它会使用"";

我对JS课程了解不多,所以我错了......

答案 1 :(得分:1)

我在REPL中使用v6.9.2:

λ 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
}

答案 2 :(得分:0)

这些问题的答案几乎总是Lodash(或Underscore)。 Lodash有isFunction

  

检查值是否归类为Function对象。

Lodash中有一些 TON ,人们总是试图重新创建。 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

答案 3 :(得分:0)

我认为值得补充的是,如果知道类或函数的名称,就可以将它们区分开来。

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

如果他们是匿名的(不确定是否在js中使用了这个术语)那么你就得到'{}'。

在程序中,您可以使用util.inspect(名称部分与toString消失)来获取这些字符串。