簡體   English   中英

原型污染與專用庫對象的性能和內存

[英]Performance and memory of prototype pollution vs dedicated library object

不知道這是否是一個新問題,因此請參考任何好的來源。

我的團隊正在處理一個大型JS圖表項目,該項目是我們從以前的開發人員那里繼承而來的,這些開發人員大量使用內置對象原型來添加可重用的代碼。 我們在Date,Object和其他內部對象中添加了許多新的實用程序功能,因此我想它們采用這種方式是因為更改原型提供了更加直觀的API。

另一方面,我們的組件遭受性能/內存陷阱的困擾,因此我們應用了所有可能的優化和最佳實踐。 我找不到關於API設計的信息。 我試圖弄清楚用庫代碼播種內置對象的原型是否比通過某種命名空間模式將它們組合到專用對象中更好。

問題是哪種設計更好? 並且其中一個會比另一個獲得性能和/或內存嗎?

Date.prototype.my_custom_function = new function (...) {...};
var period = new Date();
period.my_custom_function();

DateLib.my_custom_function // defined in a DateLib function
var period = new Date();
DateLib.my_custom_function(period);

謝謝大家,感謝您的幫助!

EDIt :主要問題是我們的組件最終變成了一個笨拙的JS野獸,它降低了某些移動設備的速度,尤其是舊設備,例如iPad1和早期的Android設備。我們已經做了很多優化,但是我仍然看到一些可疑的問題部分。 我想確定內置原型污染是否是另一個值得考慮的候選對象。 特別是, DateObject團隊負擔沉重,帶有典型的庫代碼。 例如,實際上my_custom_function是一個很大的函數,它不是代碼啟動時位於Date原型上的唯一其他成員。 Object加載得更多。 大多數客戶端代碼沒有利用這些附加功能,而是有意使用的-因此我們將決定采用哪種方式更好:

  • 繼續使用原型污染設計
  • 將可重用的API重構為單獨的庫靜態對象

老實說,我還沒有運行性能基准測試,如果有時間,我會做的。 如果某人有結果/想法將非常有幫助。

修改您不擁有的對象絕對不是一個好主意。 這里的選擇相當具有建築性:如果必須永久存儲日期,則使用構造函數的private屬性:

function DateLib() {
  this._dateObject = new Date();
}

DateLib.prototype.getDateString = function () {
  return this._dateObject.toDateString()
};

var dateLib = new DateLib();
dateLib.getDateString();

如果您只想對日期進行一些操作,請創建一個方法:

var DateLib = {
  toDateString: function (date) {
    return date.toDateString()
  }
}

DateLib.toDateString(new Date());

在性能方面,所有方法都同樣快 (感謝Bergi,Esailija進行了替代測試 )。

在此處輸入圖片說明

注意:這不是瀏覽器比較測試。 測試是在不同的機器上執行的,因此此處僅應分析方法與方法的性能。

暫無
暫無

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

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