Consider the piece of code below.
The type of exports is function. But we can still have exports.hello
property. How is that possible??
const obj = {
exports: {}
}
obj.exports = () => {
console.log('invoked')
}
obj.exports.hello = () => {
console.log('hello() invoked')
}
var output = `type of obj => ${typeof obj} ####
type of obj.exports => ${typeof obj.exports} ####
obj.exporst.hello() is ${typeof obj.exports.hello}
`;
console.log(output);
The output is:
type of obj => object #### type of obj.exports => function #### obj.exporst.hello() is function
It is logical to have an exports
object (typeof 'object'
) and have functions like exports.hello
, exports.foo
, etc. But how can we have exports itself as function and then have properties of exports?
JavaScript is highly dynamic-typed language, so this behavior is not surprising. Just think about JavaScript functions as about objects which can be called.
Functions are Objects. Anything you can do to an Object, you can do to a Function.
According to MDN documentation
And this is self sufficient to explain why you can have properties of a function
Check this link on the properties and method of function objects
to Summarize what the MDN documentation state
In short a
function is an instance of an Object