Javascript如何区分function和class?

JS里面,普通的function也可以通过new进行实例化,成为一个对象。而ES6引入的class是个阉割版本,导致class缺失了作为class的特征,class可以理解为封装的function。所以,在JS里面区分一个值是function还是class是比较麻烦的,目前TC39已经在考虑加入[[FunctionKind]]来进行区分。目前,我们可以通过一些办法来区分,如果是在纯浏览器环境下,我们有如下的一些办法:

  1. 通过字符串

把function或class与空字符串连接,得到字符串就可以看出来。

  1. 通过prototype的discriptor

对于class A而言Object.getOwnPropertyDescriptor(A, 'prototype')的writable为false,而对于function a而言,Object.getOwnPropertyDescriptor(a, 'prototype')的writable为true。

  1. 通过arguments

对于class A而言,A.arguments会报错,而对于function a而言,a.arguments为null。

这些方法都抵挡不住现在很多编译工具会把class编译为ES5的function,这导致这些特性都失效,所以能不能用还要看你项目里面的编译是怎么做的。