[英]Best practice when adding custom method to Array (Built-in object)
我創建了一個節點模塊,其中包含一些用於數組和字符串的自定義方法。
首先,我只是像常規模塊一樣使用它,並從這樣的require
獲取函數:
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
現在可以像以下方法一樣使用該方法:
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
語句iSliceSpliceHelper
為:
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(例如下划線 ),但許多也可以像我在這里提出的那樣。 參見例如Sugar ( new Sugar.Array([1,2,3])
)或Lazy ( Lazy([1,2,3])
)。
小劑量我認為使用Alt 2並不是一件大事,但我相信過度使用可能會產生問題。 如果我沒記錯的話,他們必須完全重做Cut The Rope,因為性能問題我認為很大程度上源於原型擴展。 您可能還想考慮在https://codereview.stackexchange.com/上發布此內容
一對夫婦參考:
http://perfectionkills.com/whats-wrong-with-extending-the-dom/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.