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)
No comments:
Post a Comment