美文网首页
学习exports和module.exports

学习exports和module.exports

作者: 老薛有只猫 | 来源:发表于2019-07-12 10:04 被阅读0次

    今天闲来无事学习下node.js,看到两个有意思的东西,exports和module.exports,不涉及概念,各种教程上写的太详细了,不再拾人牙慧,只是记录自己学习、探索的过程

    1、exports和module.exports是什么?

    暴力输出一下:

    console.log(exports);
    console.log(module.exports);
    // {}
    // {}
    

    竟然是两个空对象。突然灵机一动,这两个空对象会不会是同一个东西?

    console.log(exports === module.exports);
    // true
    

    我屮艸芔茻,竟然真是同一个对象。
    总结:模块内置对象,而且是个空对象。

    2、模块导出方式有什么不一样?

    创建两个模块试一下

    // module.js
    function foo() {
      console.log("this is foo");
    }
    // main.js
    var my_module = require('./module');
    console.log(my_module);
    

    在module.js中分别测试

    // 先测试exports
    exports.foo = foo; // { foo: [Function: foo] }
    exports = foo; // {}
    exports = {foo: foo}; // {}
    exports.tt = "712"; // { tt: '712' }
    
    // 再测试module.exports
    module.exports = foo; // [Function: foo]
    module.exports.foo = foo; // { foo: [Function: foo] }
    module.exports = {foo}; // { foo: [Function: foo] }
    

    很有意思,exports只能打点属性赋值导出,module.exports相比之下就灵活的多。这里解释一下为什么exports不能直接赋值导出,module.exports是真正要导出的部分,exports是module.exports的快捷访问方式(这样:exports=module.exports),直接对 exports赋值相当于之前的引用断了,重新指向了新的内存地址,也就说跟module.exports不再有关系,而此时module.exports的值还是{},所以无法导出我们想要的对象。

    exports.foo = foo;
    module.exports.tt = "红脸汉子";
    // { foo: [Function: foo], tt: '红脸汉子' }
    

    并没有发生什么意外的事情,不出所料出现在了同一屋檐下,毕竟两个变量指向同一个对象。

    相关文章

      网友评论

          本文标题:学习exports和module.exports

          本文链接:https://www.haomeiwen.com/subject/vevskctx.html