修改原型prototype会有什么风险?

作者站长头像
站长
· 阅读数 10

曾经看到过修改prototype这种做法不好,本人实际使用感觉非常方便,有什么不好的?例如:要在所有的react组件或vue组件中,做数字的格式化,直接如下:

String.prototype.toNum = Number.prototype.toNum = function(s) {
    
}

就能在所有组件中的任何字段,方便的调用toNum方法了,无需每个组件引入方法

回复
1个回答
avatar
test
2024-07-05

知道为什么JS的String、Array的包含方法不像其他语言那样叫a.contains(),而是叫a.includes()吗?因为曾经有个大聪明(MooTools),在String.prototype上挂了个非标准的contains(),结果标准委员会只好改名为includes,避免破坏那些旧的contains()的行为,导致使用MooTools的网站崩溃。

知道为什么JS的groupBy长这个样子:

Object.groupBy(array, (num, index) => {
  return num % 2 === 0 ? 'even': 'odd';
})

而不是这个样子:

array.groupBy((num, index) => {
  return num % 2 === 0 ? 'even': 'odd';
})

因为当年有个大聪明(Sugar),在Array.prototype上挂了个非标准的groupBy(),结果标准委员会只好改为静态方法Object.groupBy,避免破坏那些旧的groupBy()的行为,导致使用Sugar的网站崩溃。

类似的还有Array.prototype.flatArray.prototype.flatten之争,不一一列举了。

标准委员会每当要给JS添加新功能时,都会考虑这些新功能会不会破坏当前环境的兼容性。如果影响较大,他们就会考虑做出让步。但是,如果你没那么大影响力,他们就不会考虑对你的兼容性影响。你就要自己承担将来遇到breaking changes的风险了。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容