Javascript 如何区分函数和类对象?

Javascript 如何区分函数和类对象?,javascript,node.js,Javascript,Node.js,我有一个js对象,它可以是一个函数或一个类,也就是说,它等于: class { constructor( param ) { } onCreate() { } }; 或者 事实证明,它们比我预期的有更多的共同点(例如,两者都有一个构造函数)。请告诉我确定我的js对象所指类型的最简单方法 解决方案必须在节点4.3.2中起作用 编辑:为了澄清,我试图区分的对象是一个类或函数,而不是它们的实例。是的,我知道一个类只是合成糖,这正是造成这一困难的原因。我在v6.9.2的REPL中得到了这一

我有一个js对象,它可以是一个函数或一个类,也就是说,它等于:

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

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

解决方案必须在节点4.3.2中起作用


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

我在v6.9.2的REPL中得到了这一点:

λ node -i
> class A {}
[Function: A]
> let B = function() {}
undefined
> A.toString()
'class A {}'
> B.toString()
'function () {}'
可能还有另一种更可靠的方法,但是检查
应该有效:

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

类在JavaScript规范中不是“真正的东西”,它只是组成预先存在的语言原语的语法糖

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

事实上:Mac上的Firefox50在
上使用
toString
时不会打印“class”(它使用“function”一词)


我对JS类了解不多,所以我可能错了…

这类问题的答案几乎总是Lodash(或下划线)。洛达斯有:

检查值是否分类为函数对象

在Lodash中有很多东西,人们一直在试图重新创造。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

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

> const C = class CC { };
undefined
> const F = function FF() { };
undefined
> C.prototype
CC {}
> F.prototype
FF {}
如果它们是匿名的(不确定这个术语是否在js中使用),那么只会得到“{}”


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

谢谢您的提问。我在区分它们时遇到了同样的问题,因为我可以以任何方式声明它们并将它们用作类。希望我们能解决这个问题。由于您的示例不是有效的javascript,所以您的问题并不完全清楚。关键是ES6类只是语法糖,而不是新类型。如果你能添加一些东西,概述你为什么需要做出这种区分,也许会有所帮助。你想解决的真正问题是什么?ES6类与函数并不是完全不同的,它是定义构造函数并设置其.prototype属性的另一种语法。complete JS肯定会有所帮助。我假设您有一个对象,您需要确定它是通过类还是函数初始化的。在这种情况下,使用
\uuuuu proto\uuuuu
,如下面我的答案所示,我尝试了这个,它对我有效,谢谢。有点难看,但我想这就是它的发展方向。好吧,它将在一个特定的实现上起作用,除非有人决定在单个对象级别或更高级别(例如
函数.prototype.toString
)上重写
.toString
,你确定吗?我刚刚试过,对我来说,函数在两种情况下都返回true(函数对象和类对象)。你是说类的构造函数吗?正如我上面的问题,ES6类对象:var c=class c{};对于ES6类对象,isFunction返回true。我认为您提出的问题没有答案。这可能会有帮助不,不是这样(你提供的SO链接)。Q确实有一个答案——我接受的答案。
> const C = class CC { };
undefined
> const F = function FF() { };
undefined
> C.prototype
CC {}
> F.prototype
FF {}