如何区分箭头函数 class 和普通函数?
How can I differentiate between an arrow function, class and a normal function?
如何使用它的引用在 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'
我如何区分转译器中的这些东西 - Traceur/Babel?
你不能将前两种情况转换成这样:
var x = function x(i) {
return i + 1;
};
function z(i) {
return i + 1;
}
对于最后一个,您可以在调用它时检查它是否抱怨它是否是 class:
function isClass(instance){
try{
instance()
}catch(e){
return e.message === "Cannot call a class as a function";
}
return false;
}
但这显然会触发调用它的副作用,所以它在一般情况下不起作用。
How can I differentiate between these things in ES6?
- 箭头函数是不能用作构造函数的函数,并且没有
.prototype
属性。但是,方法也没有。他们继承自 Function.prototype
.
- classes 是在没有
new
的情况下无法调用的函数,并且具有通常不为空的 .prototype
对象。如果使用 extends
关键字,它们不会继承自 Function.prototype
.
- 函数是可以任意调用的函数,并且有一个
.prototype
即 normally empty。他们继承自 Function.prototype
.
- generator 函数是具有
.prototype
的函数,它继承自内部 GeneratorPrototype 对象,并且它们继承自内部 Generator对象。
如你所见,有一些线索。但是,属性和继承总是会被搞乱,因此您不能真正信任它。函数是否是构造函数(可以用 new
调用)无法从外部确定,您必须调用它并查看它是否抛出 - 这也可以被伪造。
因此,您最好的选择可能是 Function.prototype.toString
,以查看来源的外观。如果你的 ES 实现支持的话。
And how can I differentiate between these things in transpilers?
我认为没有任何转译器实现无原型的箭头和方法。 class 构造函数是否在被调用时抛出取决于转换的松散性,但这无论如何都不是区分的好方法。
toString
afaik 也不行。
如何使用它的引用在 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'
我如何区分转译器中的这些东西 - Traceur/Babel?
你不能将前两种情况转换成这样:
var x = function x(i) {
return i + 1;
};
function z(i) {
return i + 1;
}
对于最后一个,您可以在调用它时检查它是否抱怨它是否是 class:
function isClass(instance){
try{
instance()
}catch(e){
return e.message === "Cannot call a class as a function";
}
return false;
}
但这显然会触发调用它的副作用,所以它在一般情况下不起作用。
How can I differentiate between these things in ES6?
- 箭头函数是不能用作构造函数的函数,并且没有
.prototype
属性。但是,方法也没有。他们继承自Function.prototype
. - classes 是在没有
new
的情况下无法调用的函数,并且具有通常不为空的.prototype
对象。如果使用extends
关键字,它们不会继承自Function.prototype
. - 函数是可以任意调用的函数,并且有一个
.prototype
即 normally empty。他们继承自Function.prototype
. - generator 函数是具有
.prototype
的函数,它继承自内部 GeneratorPrototype 对象,并且它们继承自内部 Generator对象。
如你所见,有一些线索。但是,属性和继承总是会被搞乱,因此您不能真正信任它。函数是否是构造函数(可以用 new
调用)无法从外部确定,您必须调用它并查看它是否抛出 - 这也可以被伪造。
因此,您最好的选择可能是 Function.prototype.toString
,以查看来源的外观。如果你的 ES 实现支持的话。
And how can I differentiate between these things in transpilers?
我认为没有任何转译器实现无原型的箭头和方法。 class 构造函数是否在被调用时抛出取决于转换的松散性,但这无论如何都不是区分的好方法。
toString
afaik 也不行。