为什么你不应该修改JavaScript对象的原型?

43 阅读2分钟

了解为什么你不应该修改JavaScript对象原型,以及应该怎么做

作为程序员,我们必须首先学会的技能之一是如何搜索解决方案。

谷歌是你的朋友。而大多数时候,早在2009年的StackOverflow答案就是你2019+问题的完美解决方案。

在那个特定的网站上,或者在个人博客上,我有时会看到修改内置Objects原型的代码。

就像在这个例子中,数组对象原型通过添加一个insert 方法得到了增强。

Array.prototype.insert = function(index, item) {
  this.splice(index, 0, item)
}

这样,你可以拥有任何数组并对其调用insert()。

['red', 'blue'].insert(0, 'yellow')

这是很方便的。你不必定义这样的函数,也不必担心它的范围,而是把它附加到数组对象上,这样每个数组都可以使用它。

但是,仅仅因为你可以,并不意味着你应该

这种方法有什么问题呢?

可能的冲突

假设你使用的一个库实现了这种东西。而你导入的另一个库也是如此。也许这些方法的工作方式略有不同,而且事情看起来很顺利,直到它们不顺利。

你在这里有一个大问题,因为你不能修改这些库,但你仍然想使用它们。

为你的代码提供未来保护

假设下一个版本的JavaScript实现了Array.insert 方法。用一个不同的签名。现在会发生什么?你需要回去重写你写的所有代码。也许是为了一个你不再为之工作的客户。

或者你在一个库中做了这个,而这个库被其他人用在他们自己的项目中。那就更糟糕了。

这种做法只会造成技术债务,而且几乎会招致问题。

你应该怎么做呢?

在一个库文件中创建一个函数,当你想使用它的时候再导入。不要修改你无法控制的对象。