簡體   English   中英

僅在模塊內使用修改后的Array.prototype

[英]Use modified Array.prototype only within module

我正在努力在更大的代碼庫中創建模塊。 在某些情況下,我需要能夠在較大的數組中串聯子數組,因此該數組只能展平到一個維度。 在方法名稱concatAll()下,有一些庫提供類似的功能。

這是功能:

Array.prototype.concatAll = function concatAll() {
    return Array.prototype.concat.apply([], this);
};

該解決方案的問題在於,它會修改整個代碼庫的每個實例中的Array.prototype 我希望能夠將此數組方法鏈接到其他Array方法,所以我不能只創建執行此操作的函數。

myArray
  .filter(...)
  .map(...)
  .concatAll();

我知道我可以delete Array.prototype.concatAll ,但是我們的模塊加載delete Array.prototype.concatAll我只知道何時需要將模塊引導到頁面,而不知道何時模塊被“ un”引導。 因此,調用delete Array.prototype.concatAll將使該方法在模塊中不可用。

有沒有一種方法可以在不使每個數組實例都繼承該方法的情況下,將該方法臨時添加到模塊內的Array原型中?

第一個想法是安排使代碼和擴展數組原型一起在單獨的環境(例如iframe或網絡工作者)中運行。 每個這樣的環境中的Array對象都是獨立的,對一個對象的更改不會影響其他對象。

或者,假設您擔心別人沒有覆蓋您的方法,則可以按以下方式定義它:

Object.defineProperty(Array.prototype, "concatAll", {
  get: function () {
    return function concatAll() {
      return Array.prototype.concat.apply([], this);
    };
  },
  set: function() {
    throw new Error("Attempt to overwrite Array#concatAll!");
  }
});

如果其他人嘗試通過分配重新定義它,則至少會引發錯誤。 嘗試通過另一個Object.defineProperty重新定義它,因為默認情況下該屬性不可配置,因此也會拋出該Object.defineProperty

可能是次要點:

該解決方案的問題在於,它會修改整個代碼庫的每個實例中的Array.prototype。

從技術上講,當然不會修改任何實例。 如果您的意思是每個實例都將從原型中獲取新方法,那當然是對的,但是您特別擔心什么呢?

暫無
暫無

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

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