博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node.js 模块加载原理
阅读量:7297 次
发布时间:2019-06-30

本文共 1214 字,大约阅读时间需要 4 分钟。

 来自BYVoid的《Node.js+开发指南》

2015-9-14 11:23:30

有时候我们只是想把一个对象封装到模块中,例如:

//singleobject.jsfunction Hello() {    var name;    this.setName = function (thyName) {    name = thyName;};this.sayHello = function () {    console.log('Hello ' + name);};};exports.Hello = Hello;

此时我们在其他文件中需要通过 require('./singleobject').Hello 来获取

Hello 对象,这略显冗余,可以用下面方法稍微简化:

//hello.jsfunction Hello() {    var name;    this.setName = function(thyName) {    name = thyName;};this.sayHello = function() {    console.log('Hello ' + name);};};module.exports = Hello;

这样就可以直接获得这个对象了:

//gethello.jsvar Hello = require('./hello');hello = new Hello();hello.setName('BYVoid');hello.sayHello();

注意,模块接口的唯一变化是使用 module.exports = Hello 代替了 exports.Hello=Hello。在外部引用该模块时,其接口对象就是要输出的 Hello 对象本身,而不是原先的exports。

事实上,exports 本身仅仅是一个普通的空对象,即 {},它专门用来声明接口,本质上是通过它为模块闭包①的内部建立了一个有限的访问接口。因为它没有任何特殊的地方,所以可以用其他东西来代替,譬如我们上面例子中的 Hello 对象。

警告:不可以通过对 exports 直接赋值代替对 module.exports 赋值。exports 实际上只是一个和 module.exports 指向同一个对象的变量,它本身会在模块执行结束后释放,但 module 不会,因此只能通过指定module.exports 来改变访问接口。

 

可以认为在引用模块的时候,实际上引用的是export对象的属性(属性或者函数)。而在使用module.export声明接口的时候,实际上将export的指向改成了所赋值的对象,此前如果有对export属性的生命(作为接口),在重新定义export指向的对象的时候将全部失效。

 

转载于:https://www.cnblogs.com/lswit/p/4806719.html

你可能感兴趣的文章
ssh登陆不需要密码(配置信任有关系)
查看>>
Kubernetes[4]—RC(复制控制器-副本集)
查看>>
Citrix XenServer 优化
查看>>
js仿京东轮播图效果
查看>>
x-manager 管理 kvm虚拟机
查看>>
MySQL同步时,出现的ERROR 1201 (HY000)错误解决方法
查看>>
TurboMail邮件系统异地分布式部署方案
查看>>
我的友情链接
查看>>
Executors.newFixedThreadPool和ArrayBlockingQueue一点使用心得
查看>>
Android异步从网络下载图片并且缓存图片到本地的demo
查看>>
Linux Shell编程入门
查看>>
JAVA调用返回XML格式数据的WebService,并通过XPath解析XML的应用
查看>>
虚拟机windows中编译环境的分辨率能否固定
查看>>
Python-函数
查看>>
全排列
查看>>
android音乐播放器(2)
查看>>
iOS presentedViewController的基本使用
查看>>
LNMP整合安装Redmine2.3实录
查看>>
易宝典文章——怎样管理Exchange Server 2013安全组
查看>>
erlang 简单例子的编译运行
查看>>