jQuery + extends Object.prototype = "c.replace 不是一个函数"
我在我的开源项目中使用 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 不是函数”错误;我在网络上的研究引导我找到了 jQuery bug 跟踪器消息,在那里我“学会”了扩展Object.prototype 不仅破坏了 jQuery,而且也是不好的编码习惯。我的问题是,为什么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
ECMA-262 第五版(和 JavaScript 1.8.5)可以通过
Object.defineProperty
和Object.defineProperties
方法,通过设置enumerable< /code> 属性字段设置为
false
。 Chrome 5、Safari 5、Firefox 4 和 Internet Explorer 9 或任何最近使用 V8 的服务器端实现(如 Node.js)中都提供了该功能。ECMA-262 5th Edition (and JavaScript 1.8.5) has ways to do it through the
Object.defineProperty
andObject.defineProperties
methods, by setting theenumerable
field of the property tofalse
. That is available in Chrome 5, Safari 5, Firefox 4 and Internet Explorer 9 or any recent server side implementation that uses V8 (like Node.js).基本上,这是因为扩展
Object.prototype
破坏了for ... in
习惯用法。在 Javascript 中,如果您有一个对象:
您可以通过执行以下操作来迭代其成员:
扩展
Object.prototype
将导致扩展成员出现在所有对象实例中,因此上面的代码将迭代更多键比foo
和bar
更可能会产生意想不到的结果。您可以在此处找到演示该问题的小提琴。
Basically, that because extending
Object.prototype
breaks thefor ... in
idiom.In Javascript, if you have an object:
You can iterate over its members by doing:
Extending
Object.prototype
will result in the extended members being present in all object instances, so the code above would iterate over more keys thanfoo
andbar
, with probably unexpected results.You can find a fiddle demonstrating the problem here.
只要第三方代码在您的页面上运行,您就不应该运行。
因为其他程序员很可能很懒,而您破坏了他们的代码。最好不要修改不属于您的东西。
Object.prototype
就是其中之一。在您自己的范围内使用
MyLib.isEmpty(obj)
或isEmpty(obj)
这样就不会发生冲突。As long as third party code is running on your page you shouldn't.
Because there's a likelihood that other programmers are lazy, and you break their code. It is a good practice not to modify what you don't own.
Object.prototype
is one of these things.Use
MyLib.isEmpty(obj)
, orisEmpty(obj)
inside your own scope so there's no chance to collide.