zoukankan      html  css  js  c++  java
  • 浅析exports和module.exports的理解

    一、内部原理

      exports = module.exports = {}

      exports 是 module.exports 的引用,怎么理解这句话呢?大概就是 var a = {}; var b = a; a 和 b 之间的关系吧。

    1、require:在文件中 require 实际引入的是 module.exports 里面返回的东西

    2、module:module 实际上是一个对象,里面有很多属性,包括 exports 等。

      为什么可以直接打印 module,而不会报错呢?—— 因为当每个文件被执行的时候,内部都会执行 var module = new Module() 实例被创建。

    3、module.exports:给module实例中的exports对象添加的属性或者方法;

    4、exports:直接打印 exports 是个空对象,且不会报错。因为内部执行了 var module = new Module(); var exports = module.exports

    5、示例分析:

    (1)正确示例:可以看到实例对象module中的exports对象中新增了add 方法和name属性

    console.log(module);
    module.exports.add = function (x, y) { return x + y };
    exports.name = name;
    console.log(module);

    (2)错误示例1:重新改变module.exports的指向之后,exports.xxx 添加属性无效

      因为exports指向的还是之前的旧对象,exports.xxx 是往之前指向的对象中添加属性,但是module.exports所指向的是一个新的对象,所以实例对象中的exports对象只有add方法,name属性没有添加进去;

    console.log(module);
    module.exports = {
      add: function(x,y) { return x + y }
    }
    exports.name = 'tom';
    console.log(module);

    (3)错误示例2:重新改变exports的指向之后,exports.xxx添加属性无效

      因为require的原理就是引入module.exports里返回的内容,可以用exports添加属性和方法,是由于内部添加了一条exports = module.exports的引用,让exports指向了module.exports,所以更改exports的指向之后,就不会对module.exports中的内容有任何的影响了。

    console.log(module);
    module.exports.add = function (x, y) { return x + y };
    exports = { name: 'tom'};
    console.log(module);

    二、exports 与 module.exports 使用

    1、将函数直接导出成模块

    // 模块文件:./my_modules/m.js
    function fn1(){
        console.log('我是fn1')
    }
    module.exports=fn1;
    
    // index.js
    var foo=require('./my_modules/m')
    foo();  // 我是fn1

    2、如果模块文件中有两个函数,第二个会覆盖第一个

    function fn1(){
        console.log('我是fn1')
    }
    function fn2(){
        console.log('我是fn2')
    }
    module.exports=fn1;
    module.exports=fn2;
    
    // index.js
    var foo=require('./my_modules/m')
    foo();//我是fn2

    3、如何导出模块中的所有函数

        ......
        module.exports.fn1=fn1;
        module.exports.fn2=fn2;
    
        var foo=require('./my_modules/m')
        foo.fn1();//我是fn1
        foo.fn2();//我是fn2

    4、exports 是 module.exports 的一个引用,exports = module.exports = {}

      exports.xxx 相当于在导出对象上挂属性,该属性对调用模块直接可见

    // 模块文件:./my_modules/m.js
    exports.fn1=function(){
        console.log('我是fn1')
    }
    exports.fn2=function(){
        console.log('我是fn2')
    }
    
    // index.js
    var foo=require('./my_modules/m')
    foo.fn1();//我是fn1
    foo.fn2();//我是fn2

    5、小结区别:

    (1)module.exports=xxx,相当于导出某个函数或对象等内容,在另一个文件中引用后可直接使用

    (2)exports.xxx 和 module.exports.xxx 相当于把函数或变量挂载在对象上,在另一个文件中应用后,通过调用对象属性和方法进行使用。

    (3)exports 是 module.exports 的一个引用,exports = module.exports = {}

  • 相关阅读:
    Ftp、Ftps与Sftp之间的区别
    Previous Workflow Versions in Nintex Workflow
    Span<T>
    .NET Core 2.0及.NET Standard 2.0 Description
    Announcing Windows Template Studio in UWP
    安装.Net Standard 2.0, Impressive
    SQL 给视图赋权限
    Visual Studio for Mac中的ASP.NET Core
    How the Microsoft Bot Framework Changed Where My Friends and I Eat: Part 1
    用于Azure功能的Visual Studio 2017工具
  • 原文地址:https://www.cnblogs.com/goloving/p/15211746.html
Copyright © 2011-2022 走看看