修改原型prototype会有什么风险?
曾经看到过修改prototype这种做法不好,本人实际使用感觉非常方便,有什么不好的?例如:要在所有的react组件或vue组件中,做数字的格式化,直接如下:
String.prototype.toNum = Number.prototype.toNum = function(s) {
}
就能在所有组件中的任何字段,方便的调用toNum方法了,无需每个组件引入方法
回复
1个回答

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.flat
和Array.prototype.flatten
之争,不一一列举了。
标准委员会每当要给JS添加新功能时,都会考虑这些新功能会不会破坏当前环境的兼容性。如果影响较大,他们就会考虑做出让步。但是,如果你没那么大影响力,他们就不会考虑对你的兼容性影响。你就要自己承担将来遇到breaking changes的风险了。
回复

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