在现实世界中是否有任何大型现代库与扩展 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
}