编程语言
首页 > 编程语言> > javascript-将自定义方法添加到数组(内置对象)时的最佳做法

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