(不)扩充内置原型

我们可以扩充构造函数的prototype属性来为构造函数增加功能,这个特性非常强大,但有时会强大到超过我们的掌控。

给内置构造函数如Object()Array()Function()扩充原型看起来非常诱人,但这种做法会严重降低代码的可维护性,因为它会让你的代码变得难以预测。对于那些基于你的代码来做开发的开发者来说,他们更希望使用原生的JavaScript方法来保持代码的一致性,而不愿意使用你所添加的方法。

另外,如果将属性添加至原型中,很可能导致原型上的属性在那些不使用hasOwnProperty()做过滤的循环中被遍历出来,从而造成混乱。

因此,不扩充内置对象的原型是最好的,你也可以自己定义一个规则,仅当下列条件满足时才考虑扩充内置对象的原型:

  1. 未来的ECMAScript版本或者JavaScirpt会将你将要实现的方法添加为内置方法。比如,你可以实现ECMAScript5定义的一些方法,直到浏览器升级至支持ES5。这样,你只是提前定义了这些方法。
  2. 当某个属性或者方法是你在其它地方实现过的,或者是某个JavaScript引擎或浏览器的一部分,而你检查时又发现它不存在时。
  3. 在有充分的文档说明,并且和团队其他成员做了沟通的时候。

如果你遇到这三种情况之一,你可以给内置原型添加自定义方法,写法如下:

  1. if (typeof Object.protoype.myMethod !== "function") {
  2. Object.protoype.myMethod = function () {
  3. // 实现…
  4. };
  5. }