JavaScript - 为什么函数可以有属性?

Ami*_* Al 4 javascript

考虑下面的一段代码。
导出的类型是function。但我们仍然可以拥有exports.hello财产。这怎么可能??

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);
Run Code Online (Sandbox Code Playgroud)

输出是:

type of obj => object #### type of obj.exports => function #### obj.exporst.hello() is function
Run Code Online (Sandbox Code Playgroud)

拥有一个exports对象 ( typeof 'object') 并拥有诸如exports.hello,exports.foo等函数是合乎逻辑的。但是我们如何将自己导出为函数,然后拥有导出的属性呢?

Shu*_*tri 5

根据MDN 文档

在 JavaScript 中,函数是first-class objects,因为它们可以像任何其他object. 它们与其他的区别objects在于可以调用函数。简而言之,它们是Function对象。

这足以解释为什么你可以拥有一个函数的属性

在函数对象的属性和方法上检查此链接

总结 MDN 文档说明的内容

全局Function object没有自己的方法或属性。但是,由于它本身是一个函数,所以它确实通过原型链从 继承了一些方法和属性Function.prototype

总之一个 function is an instance of an Object

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

console.log(myName instanceof Object);
Run Code Online (Sandbox Code Playgroud)