11

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

我的团队正在开发一个大型 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);

谢谢,伙计们,任何帮助表示赞赏!

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

  • 继续使用原型污染设计
  • 将可重用 API 重构为单独的库静态对象

老实说,我还没有运行性能基准测试,一旦我有时间就会这样做。如果有人有结果/想法将非常有帮助。

4

1 回答 1

6

修改您不拥有的对象绝对是个坏主意。这里的选择是相当架构性的:如果您必须持久存储日期,则使用构造函数的私有属性:

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 的替代测试)。

在此处输入图像描述

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

于 2013-09-13T20:52:53.047 回答