Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript - Why can functions have properties? [duplicate]

Tags:

javascript

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?

like image 440
Amirhosein Al Avatar asked Jan 24 '18 10:01

Amirhosein Al


2 Answers

According to MDN documentation

In JavaScript, functions are first-class objects, because they can have properties and methods just like any other object. What distinguishes them from other objects is that functions can be called. In brief, they are Function objects.

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

The global Function object has no methods or properties of its own. However, since it is a function itself, it does inherit some methods and properties through the prototype chain from Function.prototype.

In short a function is an instance of an Object

function myName() {
   console.log('myName')
}

console.log(myName instanceof Object);
like image 168
Shubham Khatri Avatar answered Oct 09 '22 03:10

Shubham Khatri


Functions are Objects. Anything you can do to an Object, you can do to a Function.

like image 27
Quentin Avatar answered Oct 09 '22 04:10

Quentin