• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

module.exports对象和exports对象

武飞扬头像
Secen1997
帮助1

一、模块作用域

1、我们先来创建一个js文件模块

  1.  
    //我们先来声明一个常量和函数
  2.  
    const username = 'tom'
  3.  
     
  4.  
    function sayHi(){
  5.  
    console.log('hi 你好~')
  6.  
    }

2、将模块导入到另外一个js文件

  1.  
    //每一个js文件都是一个模块 我们准备在test模块使用01的模块 需要使用require方法将其导入
  2.  
     
  3.  
    // 模块名或者地址
  4.  
     
  5.  
    const user = require('./01-module对象')
  6.  
    //我们是想直接得到 前面一个模块的username 或者函数 但是我们发现打印出来是一个空的对象
  7.  
    console.log(user) // {}

由此我们可以得出:

我们创建的每个JS文件都是一个自定义模块,并且具有模块作用域

也就是在一个模块中创建的变量、常量、函数等等一切,都只能在当前模块中使用。

学新通

但是显然这不是我们想要的情况,那我们就是想要第二个模块去使用第一个模块的东西那怎么办呢?其实node.js本身就给了我们解决方案,它内置了一个module对象,我们可以看看下面介绍

二、module.exports对象

         在每个 .js 自定义模块中都有一个 module 对象,它里面存储了和当前模块有关的信息,打印如下

学新通

        其中大部分的属性都可以忽略,我们可以重点关注一下其中的一个属性exports,他也是一个对象。这个属性的主要作用就是将模块内的成员共享出去,供外界使用。外界用 require() 方法导入自定义模块时,得到的就是 module.exports 所指向的对象。

        接下来我们可以一起看看怎么将一个js文件模块导出

  1.  
    // 之前已验证 module.exports === {} 是一个空对象
  2.  
    //且我们已知道 module.exports可以实现向外导出成员
  3.  
     
  4.  
    module.exports.username = 'tom'
  5.  
    module.exports.sayHi = () => {
  6.  
    console.log('hi 你好~')
  7.  
    }
  8.  
     
  9.  
    // 当上面两行代码执行完毕 相当于给一个空的对象添加了两个成员
  1.  
    //导入模块数据
  2.  
    const user = require('./04-module.exports导出js模块.js')
  3.  
    console.log(user) //{ username: 'tom', sayHi: [Function (anonymous)] }
  4.  
    console.log(user.username) //tom
  5.  
    console.log(user.sayHi) // [Function (anonymous)]
  6.  
     
  7.  
    //此时我们就会发现 我们可以使用前面那个模块创建的对象 包含对象里面的方法和属性了

学新通

        这样我们就可以实现第二个js文件模块使用第一个模块添加的方法和属性了。

 三、exports对象

        由于 module.exports 单词写起来比较复杂,为了简化向外共享成员的代码,Node 提供了 exports 对象。默认情况下,exports 和 module.exports 指向同一个对象。最终共享的结果,还是以 module.exports 指向的对象为准

        下面是使用exports方法导出模块

  1.  
    // exports也是一个对象 默认情况下,exports 和 module.exports 指向同一个对象
  2.  
    //所以他也是默认也是空对象 也可以将模块导出
  3.  
    exports.username = 'zs'
  4.  
     
  5.  
    exports.sayHello = () => {
  6.  
    console.log('hello')
  7.  
    }
  1.  
    //导入模块数据
  2.  
    const user = require('./06-exports对象.js')
  3.  
     
  4.  
    console.log(user) //{ username: 'zs', sayHello: [Function (anonymous)] }
  5.  
     
  6.  
    console.log(user.username) //zs
  7.  
     
  8.  
    console.log(user.sayHello) //[Function (anonymous)]

学新通

         我们会发现 exports同样可以实现第二个js模块导入第一个模块的方法和属性。

        但是共享成员时有个比较重要的注意点使用 require() 方法导入模块时,导入的结果,永远以 module.exports 指向的对象为准

        我们可以看看下面举例

  1.  
    module.exports = {
  2.  
    name:'tom'
  3.  
    }
  4.  
     
  5.  
    exports = {
  6.  
    name:'jerry'
  7.  
    }
  8.  
     
  9.  
    //此时 module.exports 和 exports 都存在 按理说导出后写在下面的jerry会将tom覆盖 但事实是这样吗?
  1.  
    //导入模块数据
  2.  
     
  3.  
    const user = require('./08-测试优先级')
  4.  
     
  5.  
    console.log(user) // { name: 'tom' }

学新通

        我们会发现最终输出的结果是tom,这是因为 使用 require() 方法导入模块时,导入的结果,永远以 module.exports 指向的对象为准

        以下是一些模块导入和使用的总结

  1.  
    // 导入模块:
  2.  
    // 内置模块: require("内置模块名") 如:require("fs")
  3.  
    // 自定义模块: require("路径 ./或../ 自定义模块名") 如: require('./custom.js')
  4.  
    // 第三方的模块: require("第三方模块名")
  5.  
     
  6.  
    // 导出模块:
  7.  
    // module.exports 或 exports
  8.  
    // 永远以module.exports导出的为准
  9.  
    // 导出的是什么类型的数据,接收就是什么类型数据

        最后有几个练习题,有兴趣的可以看图做做哦,本文到此结束,感谢观看!!!

学新通

        大家可以试试导出模块显示的是什么 

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfkiaf
系列文章
更多 icon
同类精品
更多 icon
继续加载