Node.js匿名函数导出问题:调用与链式调用异常求助
解决Node.js中导出函数的调用与链式调用问题
嘿,刚接触JavaScript遇到这种问题太正常了,我来一步步帮你搞定这两个需求~
问题1:让导出的函数支持直接调用(如date('2017-05-16 13:45'))并返回实例
你想要的其实是让导出的函数同时作为工厂函数和构造函数——直接调用它就能生成实例,不用每次都写new date(...)。实现这个的核心是在函数内部判断调用方式,如果不是通过new关键字调用,就自动创建并返回一个实例。
举个具体的例子,修改你的index.js:
// index.js function DateHandler(dateStr) { // 关键判断:如果直接调用(不是new出来的),就返回一个新实例 if (!(this instanceof DateHandler)) { return new DateHandler(dateStr); } // 初始化实例的日期属性 this.innerDate = new Date(dateStr); } // 给实例添加获取格式化日期的方法(示例) DateHandler.prototype.format = function() { return this.innerDate.toLocaleString(); }; // 导出这个函数 module.exports = DateHandler;
然后在导入的文件里就能这样用:
const date = require('./index'); // 直接调用得到实例,不需要new const myDate = date('2017-05-16 13:45'); console.log(myDate.format()); // 输出对应的格式化日期
这样就实现了你要的“直接调用返回实例”的效果,这个函数本身也可以作为构造函数用new DateHandler(...)来创建实例,一举两得。
问题2:实现time.add().subtract().add()的链式调用
链式调用的核心很简单:每个方法执行完后返回实例本身(this),这样就能在调用完一个方法后,接着调用实例上的其他方法。
我们把上面的代码扩展一下,添加add和subtract方法:
// index.js function DateHandler(dateStr) { if (!(this instanceof DateHandler)) { return new DateHandler(dateStr); } this.innerDate = new Date(dateStr); } // 增加天数的方法,返回this支持链式调用 DateHandler.prototype.add = function(days) { this.innerDate.setDate(this.innerDate.getDate() + days); return this; // 关键:返回实例本身 }; // 减少天数的方法,同样返回this DateHandler.prototype.subtract = function(days) { this.innerDate.setDate(this.innerDate.getDate() - days); return this; // 关键:返回实例本身 }; DateHandler.prototype.format = function() { return this.innerDate.toLocaleString(); }; module.exports = DateHandler;
现在就能实现链式调用了:
const date = require('./index'); const resultDate = date('2017-05-16 13:45') .add(3) // 加3天 .subtract(1) // 减1天 .add(2); // 再加2天 console.log(resultDate.format()); // 输出最终计算后的日期
原理很简单:每次调用add或subtract后,都会返回当前的DateHandler实例,所以你可以接着调用实例上的其他方法,形成链式调用。
内容的提问来源于stack exchange,提问作者silend
相关产品推荐
相关产品推荐

