JavaScript - Why can functions have properties? [d

2020-04-12 07:01发布

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
3条回答
【Aperson】
2楼-- · 2020-04-12 07:42

JavaScript is highly dynamic-typed language, so this behavior is not surprising. Just think about JavaScript functions as about objects which can be called.

查看更多
够拽才男人
3楼-- · 2020-04-12 07:45

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

查看更多
啃猪蹄的小仙女
4楼-- · 2020-04-12 07:54

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);

查看更多
登录 后发表回答