簡體   English   中英

向Array添加自定義方法時的最佳實踐(內置對象)

[英]Best practice when adding custom method to Array (Built-in object)

我創建了一個節點模塊,其中包含一些用於數組和字符串的自定義方法。

首先,我只是像常規模塊一樣使用它,並從這樣的require獲取函數:

替代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

現在可以像以下方法一樣使用該方法:

替代2。

require('inverted-slice');
let arr1 = [1,2,3,4];
arr1.iSlice(start, stop);

我覺得哪個比Alt 1好

我的問題是,在將Alt 2中的自定義方法添加到內置對象(如ArrayString時是否有任何最佳實踐或指導原則?

擴展內置原型總是引發爭論,我認為我們可以得出結論,它被認為是最佳實踐。

另一方面,如果您可以將這些自定義方法稱為對象方法而不是普通函數,那確實很好。

您可能會考慮一個包裝器函數,它將返回一個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);

要允許鏈接,您可以將iSliceSpliceHelperreturn語句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(例如下划線 ),但許多也可以像我在這里提出的那樣。 參見例如Sugarnew Sugar.Array([1,2,3]) )或LazyLazy([1,2,3]) )。

小劑量我認為使用Alt 2並不是一件大事,但我相信過度使用可能會產生問題。 如果我沒記錯的話,他們必須完全重做Cut The Rope,因為性能問題我認為很大程度上源於原型擴展。 您可能還想考慮在https://codereview.stackexchange.com/上發布此內容

一對夫婦參考:

http://perfectionkills.com/whats-wrong-with-extending-the-dom/

https://softwareengineering.stackexchange.com/questions/104320/why-is-extending-the-dom-built-in-object-prototypes-a-bad-idea

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM