Since ES6 not all JavaScript functions have the same behaviour. Depending on whether they have been created using the function statement, via the method definition sugar inside a class or as an arrow function they will spot different features. You can read about it here, but basically, arrow functions can not be called as constructors and use a static, lexical this; methods (created via method definitions) can not be called as constructors; super can only be used inside methods...
Anyway, I thought that in spite of having different features all function objects where directly instances of Function but I've found out that this is not the case, and we have 2 additional function types (both inheriting from Function): AsyncFunction and GeneratorFunction. When you define and async function, either directly as a "normal" function, via the method syntax or as an arrow function, you are creating an instance of an AsyncFunction, and when you define an async method, as a "normal" function or via method syntax (you can not use arrows to create generators), you are creating an instance of a GeneratorFunction. You can run this code to see that I'm not lying.
class Person{
constructor(){
}
sayHi(){
}
}
function sayBye(){
}
let saySomething = (msg) => console.log("saying: " + msg);
function* myGeneratorFunc(){
yield "hi";
}
async function myAsyncFunc(){
}
console.log(Person.constructor.name);
console.log((new Person()).sayHi.constructor.name);
console.log(sayBye.constructor.name);
console.log(saySomething.constructor.name);
console.log("-----------------------");
console.log(myGeneratorFunc.constructor.name);
console.log(myGeneratorFunc.constructor.constructor.name);
console.log(myAsyncFunc.constructor.name);
console.log(myAsyncFunc.constructor.constructor.name);
console.log(myGeneratorFunc.constructor.constructor === Function);
console.log(myAsyncFunc.constructor.constructor === Function);
/*
Function
Function
Function
Function
-----------------------
GeneratorFunction
Function
AsyncFunction
Function
true
true
*/
And as I said above both function types inherit from Function (xxx.constructor.constructor === Function)


