• Node.js中exports与module.exports的区别


     

    你肯定对Node.js模块中用来创建函数的exports对象很熟悉(假设一个名为rocker.js的文件)

    exports.name = function() {

    console.log('My name is Lemmy Kilmister');

    };

    然后你在另一个文件中调用

    var rocker = require('./rocker.js');

    rocker.name(); // 'My name is Lemmy Kilmister'

    但是module.exports到底是个什么玩意儿? 它合法吗

    令人吃惊的是-module.exports是真实存在的东西。exports只是module.exports的辅助方法。你的模块最终返回module.exports给调用者,而不是exportsexports所做的事情是收集属性,如果module.exports当前没有任何属性的话,exports会把这些属性赋予module.exports。如果module.exports已经存在一些属性的话,那么exports中所用的东西都会被忽略

    把下面的内容放到rocker.js:

    module.exports = 'ROCK IT!';

    exports.name = function() {

    console.log('My name is Lemmy Kilmister');

    };

    然后把下面的内容放到另一个文件中,执行它

    var rocker = require('./rocker.js');

    rocker.name(); // TypeError: Object ROCK IT! has no method 'name'

    rocker模块完全忽略了exports.name,然后返回了一个字符串'ROCK IT!'。通过上面的例子,你可能认识到你的模块不一定非得是模块实例(module instances)。你的模块可以是任何合法的JavaScript对象 - booleannumberdateJSON stringfunctionarray和其他。你的模块可以是任何你赋予module.exports的值。如果你没有明确的给module.exports设置任何值,那么exports中的属性会被赋给module.exports中,然后并返回它

    在下面的情况下,你的模块是一个类

    module.exports = function(name, age) {

    this.name = name;

    this.age = age;

    this.about = function() {

    console.log(this.name +' is '+ this.age +' years old');

    };

    };

    然后你应该这样使用它

    var Rocker = require('./rocker.js');

    var r = new Rocker('Ozzy', 62);

    r.about(); // Ozzy is 62 years old

    在下面的情况下,你的模块是一个数组

    module.exports = ['Lemmy Kilmister', 'Ozzy Osbourne', 'Ronnie James Dio', 'Steven Tyler', 'Mick Jagger'];

    然后你应该这样使用它

    var rocker = require('./rocker.js');

    console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio

    现在你应该找到要点了 - 如果你想要你的模块成为一个特别的对象类型,那么使用module.exports;如果你希望你的模块成为一个传统的模块实例module instance),使用exports

    把属性赋予module.exports的结果与把属性赋予给exports是一样的。看下面这个例子

    module.exports.name = function() {

    console.log('My name is Lemmy Kilmister');

    };

    下面这个做的是一样的事情

    exports.name = function() {

    console.log('My name is Lemmy Kilmister');

    };

    但是请注意,它们并不是一样的东西。就像我之前说的module.exports是真实存在的东西,exports只是它的辅助方法。话虽如此,exports还是推荐的对象,除非你想把你模块 的对象类型从传统的模块实例module instance)修改为其他的

    我希望这篇文章能帮助你理解exportsmodule.exports之间的不同,并且能进一步的理解模块在Node.js中是怎么工作的。如果有任何问题,请在回复里边留言。

     

     

    来自: http://weizhifeng.net/node-js-exports-vs-module-exports.html

  • 相关阅读:
    设置代码ios中根据文本设置label高度设置代码
    程序方法对于UIWindow的认识程序方法
    信息浏览器从Android的浏览器中传递cookie数据到App中信息浏览器
    高度状态栏Android获取状态栏的高度高度状态栏
    网络监听Network Daemon(Android Netd)架构和源码分析网络监听
    文件读取Android02文件的保存与读取文件读取
    地址方法[ios开发]利用有道翻译API实现简单的翻译功能地址方法
    温度调试MAC CPU温度监视及风扇速度控制软件温度调试
    设置打开android开发之快速设置,一键wifi开闭,移动网络开闭,电池设置,飞行模式,………………………………设置打开
    界面更新android 转载 widget点击事件界面更新
  • 原文地址:https://www.cnblogs.com/time-is-life/p/7754746.html
Copyright © 2020-2023  润新知