Javascript 如何区分箭头函数、类和普通函数?
在ES6中,如何使用其引用来区分这三件事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
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
- 生成器函数是具有
的函数,该原型继承自内在GeneratorPrototype对象,并且它们继承自内在generator对象.prototype
new
调用)无法从外部确定,您必须调用它并查看它是否抛出-这也可能是伪造的
因此,您最好选择Function.prototype.toString
,以查看源代码的外观。如果您的ES实现支持这一点
我怎样才能在传送带中区分这些东西呢
我不认为任何transpiler实现了无原型的箭头和方法。类构造函数在被调用时是否抛出取决于传输的松散性,但这无论如何都不是区分的好方法。toString
同样不起作用。您的用例是什么?我会尝试调用func.toString(),看看我得到了什么,也许会对它进行分析。我强烈建议类名遵循构造函数以大写字母开头的长期传统。这样一来,一眼就很容易看出Function()
是类或构造函数,Function()
是函数。呃,为什么否决了这个?它直接回答了这个问题。在没有解释的情况下通过投票否决某些内容是非常不礼貌的。我认为,因为在使用transpiler之前,您不会被传输,否则在本机浏览器中,这种情况将不会发生applied@BarbuBarbu问题的最后一部分是专门询问关于传输后的差异化。哦,当然,对不起,我的错,谢谢!。我刚在v8上试用过,效果很好。但当我在方法上尝试时失败了。更新了要点。现在也支持检测生成器和方法。我希望我的假设是正确的。在代码注释中提到它们。