JavaScript - 为什么函数具有属性?

时间:2018-01-24 10:42:42

标签: javascript

考虑下面的代码段 导出类型为功能。但我们仍然可以拥有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);

输出结果为:

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

拥有exports对象(typeof 'object')并具有exports.helloexports.foo等函数是合乎逻辑的。但是我们如何将导出本身作为函数和然后有出口的属性?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

根据 MDN documentation

  

在JavaScript中,函数是first-class objects,因为它们可以   拥有与任何其他object一样的属性和方法。什么   将它们与其他objects区别开来是可以调用函数。   简而言之,它们是Function个对象。

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

检查 this link 有关函数对象的属性和方法

总结MDN文档的状态

  

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

简而言之function is an instance of an Object

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

console.log(myName instanceof Object);

答案 2 :(得分:1)

JavaScript是高度动态类型的语言,因此这种行为并不令人惊讶。只需将JavaScript函数视为可以调用的对象。