[英]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.