不确定这是否是一个新问题,所以如果你有任何好的来源,请参考。
我的团队正在开发一个大型的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 ...我们做了很多优化,但我仍然看到几个可疑的部分。我想确定内置的原型污染是否是另一个值得研究的候选者。
特别是,Date
和Object
人员负载着大量典型的库代码。例如,实际上my_custom_function
是一个很大的功能,它不是代码启动时Date
原型上唯一的附加成员。
Object
的加载速度更快。大多数客户端代码没有使用这些附加功能,它是故意使用的 - 所以我们将决定我们最好坚持使用哪种方式:
答案 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)。
注意:这不是浏览器比较测试。测试是在不同的机器上进行的,因此这里只应分析方法与方法的性能。