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

JavaScript-为什么函数可以有属性?,javascript,Javascript,考虑下面的一段代码。 导出类型为函数。但是我们仍然可以有导出。hello属性。这怎么可能 const obj = { exports: {} } obj.exports = () => { console.log('invoked') } obj.exports.hello = () => { console.log('hello() invoked') } var output = `type of obj => ${typeof obj} ####

考虑下面的一段代码。
导出类型为函数。但是我们仍然可以有
导出。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);
输出为:

type of obj => object #### type of obj.exports => function #### obj.exporst.hello() is function

有一个
导出
对象(
类型为'object'
)并具有类似
导出.hello
导出.foo
等功能是合乎逻辑的。但是我们如何将导出本身作为函数,然后拥有导出的属性呢?

函数是对象。你可以对一个对象做任何事情,你也可以对一个函数做任何事情。

JavaScript是一种高度动态类型化的语言,所以这种行为并不奇怪。只需将JavaScript函数看作是可以调用的对象。

根据

在JavaScript中,函数是第一类对象,因为它们可以 具有与任何其他
对象一样的属性和方法。什么
它们与其他
对象的区别在于可以调用函数。
简而言之,它们是
函数
对象

这足以解释为什么可以有函数的属性

检查函数对象的属性和方法

总结MDN文档的状态

全局
函数对象
没有自己的方法或属性。 但是,由于它本身是一个函数,因此它确实继承了一些方法 通过
Function.prototype
中的prototype链创建属性

简而言之,
函数是对象的实例

函数myName(){
console.log('myName')
}

log(对象的myName实例)javascript是一个奇怪而美丽的创意每个函数都是一个对象-它有一个构造函数(当然,命名尽可能奇怪,-
函数
)。是的,<代码> Type of < /Cord>返回不同的值,但更多的是关于<代码> Type of < /COD>的怪异(考虑<代码> null < /Calp> case)。JavaScript远不是唯一具有这种特性的语言。考虑更简单的情况,即每个函数默认有许多内置属性和方法,例如<代码> Fo.BIN(BAR)< /代码>,
foo.length
…我要添加对象的
警报实例//true