javascript-将自定义方法添加到数组(内置对象)时的最佳做法
作者:互联网
我创建了一个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