我在我的开源项目中使用jQuery 1.5,以下行也出现在我自己的Javascript代码中:
/**
* Object.isEmpty()
*
* @returns {Boolean}
*/
Object.prototype.isEmpty = function ()
{
/**
* @deprecated Since Javascript 1.8.5
* @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object
*/
if ( this.__count__ !== undefined )
{
return this.__count__ === 0 ? true : false;
}
/* Less-aesthetic method, if above method fails */
for ( var property in this )
{
if ( this.hasOwnProperty(property) )
{
return false;
}
}
return true;
};
它只是扩展了Object.prototype,为它添加了isEmpty()方法[检查对象是否为空)。由于这个添加,我的Firebug控制台中出现“c.replace is not function”错误;我在网上的研究引导我进入jQuery bug tracker message,在那里我“学会”扩展Object.prototype不仅打破了jQuery,而且还是糟糕的编码实践。我的问题是,为什么?
答案 0 :(得分:5)
ECMA-262第5版(和JavaScript 1.8.5)通过Object.defineProperty
和Object.defineProperties
方法,通过将属性的enumerable
字段设置为{{}来实现此方法1}}。这在Chrome 5,Safari 5,Firefox 4和Internet Explorer 9或任何最近使用V8的服务器端实现(如Node.js)中都可用。
答案 1 :(得分:4)
基本上,因为延长Object.prototype
会破坏for ... in
成语。
在Javascript中,如果你有一个对象:
var obj = { "foo": 0, "bar": 42 };
您可以通过执行以下操作来迭代其成员:
for (var key in obj) {
// Do Something.
}
扩展Object.prototype
将导致扩展成员出现在所有对象实例中,因此上面的代码将迭代超过foo
和bar
的更多键,可能会出现意外结果。< / p>
你可以找到一个演示问题的小提琴here。
答案 2 :(得分:2)
1)如何向
Object
添加(扩展)其他方法(不是属性)?
只要第三方代码在您的网页上运行,您就不应该这样做。
2)如果您可以在
hasOwnProperty()
的帮助下区分对象的直接孩子和全局孩子,为什么这是一个错误的编码?
因为其他程序员可能很懒,而且打破他们的代码。最好不要修改你不拥有的东西。 Object.prototype
就是其中之一。
在您自己的范围内使用MyLib.isEmpty(obj)
或isEmpty(obj)
,因此无法发生碰撞。