标签:javascript-objects node-js javascript node-modules
我创建了一个node module,其中包含几个用于数组和字符串的自定义方法.
首先,我只是像常规模块一样使用它,并从如下需求中获取功能:
Alt 1.
const invSlice = require('inverted-slice');
let arr1 = [1,2,3,4];
invSlice.iSlice(arr, start, stop);
这可以工作,但是最好将iSlice作为Array对象的方法来调用.我通过在库中添加以下代码来解决此问题:
Array.prototype.iSlice = iSliceBuiltin; // iSliceBuiltin is my function
现在可以像下面这样使用该方法:
Alt 2.
require('inverted-slice');
let arr1 = [1,2,3,4];
arr1.iSlice(start, stop);
我认为比Alt 1更好.
题
我的问题是,在将诸如Alt 2中的自定义方法添加到诸如Array或String之类的内置对象中时,是否有最佳实践或指南可循?
解决方法:
扩展内置原型总是引发争论,我认为我们可以得出结论,这不是最佳实践.
另一方面,如果您可以将这些自定义方法作为对象方法而不是普通函数来调用,则的确很好.
您可能会考虑一个包装函数,该函数将返回一个Array实例,该实例具有为其定义的其他方法:即,不是在原型上,而是在Array实例本身上.
您的模块可能如下所示:
function iArray(arr) {
return Object.assign([], arr || [], {
iSlice: iSliceBuiltin,
iSplice: iSpliceBuiltin
});
}
// ... your module functions come here, but excluding the changes to the Array prototype
module.exports = {
iArray
}
然后,您将像这样使用它:
const iArray = require('inverted-slice');
let arr1 = iArray([1,2,3,4]); // enrich array with extra methods
let result = arr1.iSlice(0, 1);
要允许链接,可以将iSliceSpliceHelper中的return语句更改为:
return iArray(newArr);
因此,现在您可以编写:
let arr1 = iArray([1,2,3,4]); // enrich array with extra methods
let result = arr1.iSlice(0, 1).iSlice(1, 2);
现有的库可能会实现您的替代项1(例如underscore),但是许多库也会像我在这里建议的那样去做.参见例如Sugar(新的Sugar.Array([1,2,3]))或Lazy(Lazy([1,2,3])).
标签:javascript-objects,node-js,javascript,node-modules 来源: https://codeday.me/bug/20191026/1938466.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。