zoukankan      html  css  js  c++  java
  • Node.js中exports与module.exports的区别

    一、exports使用

    test.js

    exports.name = function() {
        console.log('张三');
    };

    index.js使用

    var test= require('./test.js');
    test.name(); // '张三'

    错误用法

    exports = function() {
        console.log('张三');
    };

    这样相当于给exports对象重新赋值,不能导出,调用模块不能访问exports对象及其属性

    说明

    • exports对象实际上就是对module.exports的引用exports只是它的一个辅助工具,最终返回给调用的是Module.exports而不是exports
    • 如果你没有显式的给Module.exports设置任何属性和方法,那么你的模块就是exports设置给Module.exports的属性

    二、module.exports使用

    2.1 module.exports与exports使用顺序问题

    test.js 

    module.exports = {name:'张三'};
    exports.getName = function(){
      console.log('李四')
    };

     index.js使用

    var test = require('./test.js');
    console.log(test.name); // 输出结果 -> 张三
    test.getName(); // Uncaught TypeError: test.getName is not a funtion

    说明

    • module.exports对象不为空的时候exports对象就自动忽略,因为module.exports通过赋值方式已经和exports对象指向的变量不同了,exports对象怎么改和module.exports对象没关系了
    • 所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果Module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略

     

    2.2 使用module.exports导出一个类 

    person.js

    module.exports = function(name, age) {
        this.name = name;
        this.age = age;
        this.about = function() {
            console.log(this.name +' is '+ this.age +' years old');
        };
    };

    index.js 使用

    var Person = require('./person.js');
    var p1 = new Test('张三', 22);
    p1.about(); // 张三 is 22 years old

     

    2.3 使用module.exports导出一个数组

    test.js

    module.exports = ['a', 'b', 'c', 'd', 'e'];

    index.js 使用

    var test = require('./test.js');
    console.log(test[2]); // c

    2.4 常见使用方法解释

    exports = module.exports = somethings

    等价于

    module.exports = somethings
    exports = module.exports

    说明

    module.exports = somethings 是对 module.exports 进行了覆盖,此时 module.exports 和 exports 的关系断裂,module.exports 指向了新的内存块,而 exports 还是指向原来的内存块,为了让 module.exports 和 exports 还是指向同一块内存或者说指向同一个 “对象”,所以我们就 exports = module.exports 。

    总结:

    • exports是module.exports的一个引用
    • require引用模块后,返回给调用者的是module.exports而不是exports
    • exports.xxx,相当于在导出对象上挂属性,该属性对调用模块直接可见
    • exports = 相当于给exports对象重新赋值,调用模块不能访问exports对象及其属性
    • 如果此模块是一个类,就应该直接赋值module.exports,这样调用者就是一个类构造器,可以直接new实例 

    参考资料

      https://www.zhihu.com/question/26621212

      https://www.cnblogs.com/axl234/p/6405370.html

      http://blog.csdn.net/pwiling/article/details/51958693

  • 相关阅读:
    如何在Kubernetes集群动态使用 NAS 持久卷
    如何在Kubernetes集群动态使用 NAS 持久卷
    谷歌浏览器报错Unchecked runtime.lastError: The message port closed before a response was received.。
    优化信息流很麻烦?三招教你轻松搞定
    优化信息流很麻烦?三招教你轻松搞定
    java多线程
    java多线程
    酷狗音乐快速转换MP3格式的方法
    Golang项目部署
    解析HTML、JS与PHP之间的数据传输
  • 原文地址:https://www.cnblogs.com/lvmylife/p/8309035.html
Copyright © 2011-2022 走看看