在Javascript中向Object.prototype添加方法有什么好处和危险?

时间:2010-09-30 16:16:57

标签: javascript prototype

我知道五年前这是一个有争议的问题,但我想知道今天的JavaScript是否有所改变。是否有任何现实世界的主要现代图书馆示例与扩展Object.prototype

不兼容

我对假设“有人可能会在您想要使用的库中编写错误的for in迭代代码感兴趣,可能在将来,然后您可能会得到一个奇怪的错误”

1 个答案:

答案 0 :(得分:12)

  

是否存在与扩展Object.prototype不兼容的主要现代库的真实示例?

是的,我记得jQuery的问题,例如较少侵入性的库之一 -

我记得的另一个案例是有人向load对象添加了Object.prototype函数,这导致$().load事件出现问题:

// DON'T DO THIS ! :)
Object.prototype.load = function () {};

​$(window).load(function () {
  alert('load event'); // never fired
});​

示例here

永远不建议以这种方式扩充Object.prototype对象,因为这些属性将由大量对象继承 - 即使是某些宿主对象 - 并且如您所知,主要关注的是它们将由for-in声明枚举。

在ECMAScript 5中,现在存在一种更安全的方式,因为我们现在可以声明不可枚举的属性,例如:

Object.defineProperty(Object.prototype, 'foo', { value: 'bar' });

在属性描述符 - { value: 'bar' }中 - 我们可以指定属性属性,对于值属性,如上例所示,我们可以指定writable属性,和公共configurable属性(确定是否可以重新配置属性 - 属性更改 - 或删除。

我们还有enumerable属性,用于确定for-in语句是否会枚举该属性。

如果我们没有指定属性,默认情况下它们是false,描述符将如下所示:

{
  value: 'bar',
  writable: false,
  configurable: false,
  enumerable: false
}