Javascript 如何区分箭头函数、类和普通函数?

Javascript 如何区分箭头函数、类和普通函数?,javascript,ecmascript-6,arrow-functions,Javascript,Ecmascript 6,Arrow Functions,在ES6中,如何使用其引用来区分这三件事 let x = i => i+1; class y { constructor(i) { this._i=i+1; } get i(){ return this._i;} } function z(i) { return i+1; } 例如: test(x) //=> 'arrow' test(y) //=> 'class' test(z) //=> 'function' 在transpilers-Traceur/Babe

在ES6中,如何使用其引用来区分这三件事

let x = i => i+1;

class y { constructor(i) { this._i=i+1; } get i(){ return this._i;} }

function z(i) { return i+1; }
例如:

test(x) //=> 'arrow'
test(y) //=> 'class'
test(z) //=> 'function'

在transpilers-Traceur/Babel中,我如何区分这些东西?

前两个案例不能被转换成这样:

var x = function x(i) {
  return i + 1;
};

function z(i) {
  return i + 1;
}
对于最后一个,您可以在调用它时检查它是否抱怨它是一个类:

function isClass(instance){
  try{
    instance()
  }catch(e){
    return e.message === "Cannot call a class as a function";
  }
  return false;
}
但这显然会引发调用它的副作用,因此在一般情况下不起作用

如何在ES6中区分这些内容

  • 箭头函数是不能用作构造函数的函数,并且没有
    .prototype
    属性。然而,方法也不能。它们继承自
    Function.prototype
  • 类是在没有
    new
    的情况下无法调用的函数,并且具有通常不为空的
    .prototype
    对象。如果使用了
    extends
    关键字,则它们不会继承自
    Function.prototype
  • 函数是可以通过任何一种方式调用的函数,并且确实有一个
    .prototype
    。它们继承自
    Function.prototype
  • 生成器函数是具有
    .prototype
    的函数,该原型继承自内在GeneratorPrototype对象,并且它们继承自内在generator对象
正如你所看到的,这里有一些线索。但是,属性和继承总是会被弄乱,因此您不能真正信任它。函数是否是构造函数(可以用
new
调用)无法从外部确定,您必须调用它并查看它是否抛出-这也可能是伪造的

因此,您最好选择
Function.prototype.toString
,以查看源代码的外观。如果您的ES实现支持这一点

我怎样才能在传送带中区分这些东西呢

我不认为任何transpiler实现了无原型的箭头和方法。类构造函数在被调用时是否抛出取决于传输的松散性,但这无论如何都不是区分的好方法。

toString
同样不起作用。

您的用例是什么?我会尝试调用func.toString(),看看我得到了什么,也许会对它进行分析。我强烈建议类名遵循构造函数以大写字母开头的长期传统。这样一来,一眼就很容易看出
Function()
是类或构造函数,
Function()
是函数。呃,为什么否决了这个?它直接回答了这个问题。在没有解释的情况下通过投票否决某些内容是非常不礼貌的。我认为,因为在使用transpiler之前,您不会被传输,否则在本机浏览器中,这种情况将不会发生applied@BarbuBarbu问题的最后一部分是专门询问关于传输后的差异化。哦,当然,对不起,我的错,谢谢!。我刚在v8上试用过,效果很好。但当我在方法上尝试时失败了。更新了要点。现在也支持检测生成器和方法。我希望我的假设是正确的。在代码注释中提到它们。