zoukankan      html  css  js  c++  java
  • module.exports与exports

    API文档是枯燥的,下面本人收集了一些论坛经常有人疑问和开源代码中经常遇到的案例供大家研究一下。

    module.exports与exports的区别

    每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}

     module.exports = {};

    Node.js为了方便地导出功能函数,node.js会自动地实现以下这个语句

    foo.js

    1  exports.a = function(){
    2  console.log('a')
    3  }
    4 
    5  exports.a = 1

    test.js

    1  var x = require('./foo');
    2  console.log(x.a)

    看到这里,相信大家都看到答案了,exports是引用 module.exports的值。module.exports 被改变的时候,exports不会被改变,而模块导出的时候,真正导出的执行是module.exports,而不是exports

    再看看下面例子

    foo.js

    1 exports.a = function(){
    2   console.log('a')
    3  }
    4  module.exports = {a: 2}
    5  exports.a = 1

    test.js

    1  var x = require('./foo');
    2  console.log(x.a)

    result:

     2

    exports在module.exports 被改变后,失效。

    是不是开始有点廓然开朗,下面将会列出开源模块中,经常看到的几个使用方式。

    module.exports = View

     1 function View(name, options) { 
     2    options = options || {};
     3    this.name = name;
     4    this.root = options.root;
     5    var engines = options.engines;
     6    this.defaultEngine = options.defaultEngine;
     7    var ext = this.ext = extname(name);
     8    if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no         extension was provided.');
     9    if (!ext) name += (ext = this.ext = ('.' != this.defaultEngine[0] ? '.' : '') +     this.defaultEngine);
    10    this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express);
    11    this.path = this.lookup(name);
    12  }
    13 
    14  module.exports = View;

    javascript里面有一句话,函数即对象,View 是对象,module.export =View, 即相当于导出整个view对象。外面模块调用它的时候,能够调用View的所有方法。不过需要注意,只有是View的静态方法的时候,才能够被调用,prototype创建的方法,则属于View的私有方法。

    foo.js

    1  function View(){
    2 
    3  }
    4  View.prototype.test = function(){
    5   console.log('test')
    6  }
    7  View.test1 = function(){
    8   console.log('test1')
    9  }

    module.exports = View

    test.js

    1  var x = require('./foo');
    2  console.log(x) //{ [Function: View] test1: [Function] }
    3  console.log(x.test) //undefined
    4  console.log(x.test1) //[Function]
    5  x.test1() //test1
    var app = exports = module.exports = {};

    其实,当我们了解到原理后,不难明白这样的写法有点冗余,其实是为了保证,模块的初始化环境是干净的。同时也方便我们,即使改变了 module.exports 指向的对象后,依然能沿用 exports的特性

    1  exports = module.exports = createApplication;
    2  /**
    3   * Expose mime.
    4   */
    5  exports.mime = connect.mime;

    例子,当中 module.exports = createApplication 改变了module.exports了,让exports失效,通过exports = module.exports的方法,让其恢复原来的特点。

    exports.init= function(){}

    这种最简单,直接就是导出模块 init的方法。

    var mongoose = module.exports = exports = new Mongoose;

    集多功能一身,不过根据上文所描述的,大家应该不能得出答案。

    原文地址:https://cnodejs.org/topic/52308842101e574521c16e06

  • 相关阅读:
    Java基础——clone()方法浅析
    Unity shader error: “Too many texture interpolators would be used for ForwardBase pass”
    ar 解压一个.a文件报错: xxx.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
    How to set up "lldb_codesign" certificate!
    Unity-iPhone has Conflicting Provisioning Settings
    ETC1/DXT1 compressed textures are not supported when publishing to iPhone
    Xcode 提交APP时遇到 “has one iOS Distribution certificate but its private key is not installed”
    XCode iOS之应用程序标题本地化
    苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置
    Unity 4.7 导出工程在XCode10.1上编译报错
  • 原文地址:https://www.cnblogs.com/joyco773/p/9296888.html
Copyright © 2011-2022 走看看