文档章节

微信小程序中module.exports和exports的区别

第九程序
 第九程序
发布于 2017/05/03 10:25
字数 756
阅读 22
收藏 0

微信小程序中module.exports与exports的用法可以查看下面官方提供的文档,使用起来还是比较简单方便的,但时对于这两者的区别解释的不是很明白。

微信小程序官方文档--框架--逻辑层--模块化.png

为了更好的理解 exports 和module.exports 的关系,我们先来补点 js 基础。示例:

// index.js
Page({
    onLoad: function(){
        var a = {name: '张三'};
        var b = a;
        console.log(a);
        console.log(b);

        b.name = '李四';
        console.log(a);
        console.log(b);

        var b = {name: '王五'};
        console.log(a);
        console.log(b);
    }
})

运行 app.js 结果为:

{ name: '张三' }
{ name: '张三' }
{ name: '李四' }
{ name: '李四' }
{ name: '李四' }
{ name: '王五' }

解释一下:
a 是一个对象,b 是对 a 的引用,即 a 和 b 指向同一个对象,即 a 和 b 指向同一块内存地址,所以前两个输出一样。
当对 b 作修改时,即 a 和 b 指向同一块内存地址的内容发生了改变,所以 a 也会体现出来,所以第三四个输出一样。
当对 b 完全覆盖时,b 就指向了一块新的内存地址(并没有对原先的内存块作修改),a 还是指向原来的内存块,即 a 和 b 不再指向同一块内存,也就是说此时 a 和 b 已毫无关系,所以最后两个输出不一样。

明白了上述例子后,我们进入正题。我们只需知道三点即可知道exports 和module.exports 的区别了:

  • exports 是指向的module.exports 的引用;
  • module.exports 初始值为一个空对象{},所以exports 初始值也是{};
  • require() 返回的是module.exports 而不是exports。
    所以:我们通过
    var name = '张三';
    exports.name = name;
    exports.sayName = function() {
      console.log(name);
    }
    给 exports 赋值其实是给module.exports 这个空对象添加了两个属性而已,上面的代码相当于:
    var name = '张三';
    module.exports.name = name;
    module.exports.sayName = function() {
       console.log(name);
    }

下面就在微信小程序中module.exports和exports的区别做出示例

// common.js 
function sayHello(name) {
    console.log(`Hello ${name} !`);
}
function sayGoodbye(name) {
    console.log(`Goodbye ${name} !`);
}
// 第一种情况,module.exports初始值为空对象,两个函数使用module.exports或exports都一样效果
module.exports.sayHello = sayHello;
module.exports.sayGoodbye = sayGoodbye; 
exports.sayHello = sayHello;
exports.sayGoodbye = sayGoodbye; 

// 第二种情况,module.exports初始值不为空对象,只能使用module.exports暴露接口,而不能使用exports暴露,会出现is not a function错误。
module.exports = {name:1};// module.exports给一个初始值

//以下两个正常使用
module.exports.sayHello = sayHello;  
module.exports.sayGoodbye = sayGoodbye;

//使用以下两个会报错误sayHello is not a function
exports.sayHello = sayHello;  
exports.sayGoodbye = sayGoodbye;

综上所述,当module.exports 指向新的对象时,exports 断开了与 module.exports 的引用,module.exports 指向了新的内存块,而 exports 还是指向原来的内存块。
因此,在不是很清楚两者关系的时候,请采用module.exports来暴露接口,而尽量不采用exports暴露接口。

本文转载自:http://www.jianshu.com/p/2431adaa97bf

共有 人打赏支持
第九程序
粉丝 84
博文 142
码字总数 172691
作品 0
厦门
程序员
exports和module.express的区别

每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {} exports和module.exports指向同一块内存,但require()返回的是module.expo...

翔飘飘
05/03
0
0
nodejs开发——require与exports的使用

在前面几篇博客中,我们始终在学习如何进行nodejs的模块化编程,nodejs中模块化编程最主要的一个特征就是常常可以在很多js文件看到require(),也就是引入其他的js文件,非常类似与其他语言中...

CHENYUFENG1991
2017/02/01
0
0
node.js - exports 和 module.exports 的区别

我也来为大家分析分析 node.js 中 exports 和 module.exports 的简单区别 首先明确一点 module.exports = exports = {},在初始化的时候是这样的,这里 exports 作为 module.exports 的一个辅...

big_cat
2016/05/16
57
0
nodejs中export与module.exports

区别如下: exports = module.exports = {}; exports 是 module.exports 的一个引用 module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {} require 引用模块后,返回的是 modu...

Yohance
2016/07/30
54
0
exports 与 module.exports 的区别

CommonJS 模块 module.exports 初始值为一个空对象 {} exports 是 module.exports 的别名,即 exports 指向 module.exports require() 返回的是 module.exports 而不是 exports。故两者选其一...

中柠檬
2017/07/31
7
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

7 个致命的 Linux 命令

导读 如果你是一个 Linux 新手,在好奇心的驱使下,可能会去尝试从各个渠道获得的命令。以下是 7 个致命的 Linux 命令,轻则使你的数据造成丢失,重则使你的系统造成瘫痪,所以,你应当竭力避...

问题终结者
今天
0
0
设计模式:工厂方法模式(工厂模式)

工厂方法模式才是真正的工厂模式,前面讲到的静态工厂模式实际上不能说是一种真正意义上的设计模式,只是一种变成习惯。 工厂方法的类图: 这里面涉及到四个种类: 1、抽象产品: Product 2、...

京一
今天
0
0
区块链和数据库,技术到底有何区别?

关于数据库和区块链,总会有很多的困惑。区块链其实是一种数据库,因为他是数字账本,并且在区块的数据结构上存储信息。数据库中存储信息的结构被称为表格。但是,区块链是数据库,数据库可不...

HiBlock
今天
0
0
react native 开发碰到的问题

react-navigation v2 问题 问题: static navigationOptions = ({navigation, navigationOptions}) => ({ headerTitle: ( <Text style={{color:"#fff"}}>我的</Text> ), headerRight: ( <View......

罗培海
今天
0
0
Mac Docker安装流程

久仰Docker大名已久,于是今天趁着有空,尝试了一下Docker 先是从docker的官网上下载下来mac版本的docker安装包,安装很简易,就直接拖图标就好了。 https://www.docker.com/products/docker...

writeademo
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部