原型污染与专用库对象的性能和记忆

时间:2013-09-13 09:43:28

标签: javascript performance oop

不确定这是否是一个新问题,所以如果你有任何好的来源,请参考。

我的团队正在开发一个大型的JS图表项目,我们从以前的开发人员那里继承而来,他们大量使用内置对象原型来添加可重用的代码。我们在Date,Object和其他内部对象中添加了许多新的实用程序函数,所以我猜他们就这样了,因为改变原型会提供更直观的API。

另一方面,我们的组件会遇到性能/内存问题,我们会应用所有可能的优化和最佳实践。我找不到关于API设计的一个。我试图弄清楚是否最好使用库代码来种植内置对象的原型,而不是通过某种命名空间模式将它们组合到专用对象中。

问题是哪种设计更好?他们中的一个会获得另一个人的表现和/或记忆吗?

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

VS

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

谢谢,伙计们,感谢任何帮助!

修改: 主要的问题是我们的组件最终成为一个笨拙的JS野兽,减慢了一些移动设备,特别是旧的,如iPad1和早期的Androids ...我们做了很多优化,但我仍然看到几个可疑的部分。我想确定内置的原型污染是否是另一个值得研究的候选者。 特别是,DateObject人员负载着大量典型的库代码。例如,实际上my_custom_function是一个很大的功能,它不是代码启动时Date原型上唯一的附加成员。 Object的加载速度更快。大多数客户端代码没有使用这些附加功能,它是故意使用的 - 所以我们将决定我们最好坚持使用哪种方式:

  • 继续使用原型污染设计
  • 将可重用的API重构为单独的库静态对象
说实话,我还没有运行性能基准,一旦有时间,我会做。如果某人有结果/想法会非常有帮助。

1 个答案:

答案 0 :(得分:6)

Modifying objects you don't own绝对是个坏主意。这里的选择是相当的架构:如果你必须持久存储一个日期,那么使用构造函数的私有属性:

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());

关于表演,所有方法are equally fast(感谢Bergi,Esailija alternative test)。

enter image description here

注意:这不是浏览器比较测试。测试是在不同的机器上进行的,因此这里只应分析方法与方法的性能。