【问题标题】:What are the benefits and dangers of adding methods to Object.prototype in Javascript?在 Javascript 中向 Object.prototype 添加方法的好处和危险是什么?
【发布时间】:2011-04-19 10:59:15
【问题描述】:

我知道五年前这是一个有争议的问题,但我想知道今天的 JavaScript 是否发生了变化。是否有大型现代图书馆与扩展 Object.prototype 不兼容的真实世界示例?

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

【问题讨论】:

标签: javascript prototype


【解决方案1】:

在现实世界中是否有任何大型现代库与扩展 Object.prototype 不兼容的示例?

是的,我记得 jQuery 的问题,它是 侵入性较小的库之一,例如:

我记得的另一种情况是,有人在Object.prototype 对象中添加了load 函数,导致$().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' }-中我们可以指定属性属性,如上例中的Value Properties,我们可以指定writable属性,常见的@ 987654332@ 属性(确定是否可以重新配置属性 - 属性更改 - 或删除。

我们还有enumerable 属性,它决定了属性是否会被for-in 语句枚举。

如果我们不指定属性,默认为false,描述符如下:

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

【讨论】:

  • 感谢有关 jQuery 在扩展 Object.prototype 时无法正常工作的信息。我读到他们计划在未来的某个时候让它很好地互动。我想现在扩展 Object.prototype 还为时过早。
  • 索取更多信息;我在对象原型中放置了 2 个扩展(forEach 和 getLength),它破坏了大部分 google 的脚本。
猜你喜欢
  • 2011-07-17
  • 1970-01-01
  • 2019-07-13
  • 2021-11-16
  • 2019-11-22
  • 2012-02-10
  • 1970-01-01
  • 2022-01-02
相关资源
最近更新 更多