繁体   English   中英

jQuery +扩展Object.prototype =“c.replace不是函数”

[英]jQuery + extending Object.prototype = “c.replace is not a function”

我在我的开源项目中使用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跟踪器消息 ,在那里我“学会”扩展Object.prototype不仅打破了jQuery,而且还是糟糕的编码实践。 我的问题是,为什么?

ECMA-262第5版(和JavaScript 1.8.5)通过将属性的enumerable字段设置为false ,可以通过Object.definePropertyObject.defineProperties方法完成此Object.defineProperty 这在Chrome 5,Safari 5,Firefox 4和Internet Explorer 9或任何最近使用V8的服务器端实现(如Node.js)中都可用。

基本上,因为扩展Object.prototype打破了for ... in idiom。

在Javascript中,如果您有一个对象:

var obj = { "foo": 0, "bar": 42 };

您可以通过执行以下操作迭代其成员:

for (var key in obj) {
    // Do Something.
}

扩展Object.prototype将导致扩展成员出现在所有对象实例中,因此上面的代码将迭代比foobar更多的键,可能会出现意外结果。

你可以找到一个在这里展示问题的小提琴。

1)如何向Object添加(扩展)其他方法(不是属性)?

只要第三方代码在您的页面上运行,您就不应该这样做。

2)如果您可以通过hasOwnProperty()帮助区分对象的直接子对象和全局对象,为什么它是一个错误的编码?

因为其他程序员可能很懒,而且你破坏了他们的代码。 不修改您不拥有的内容是一种很好的做法。 Object.prototype就是其中之一。

在你自己的范围内使用MyLib.isEmpty(obj)isEmpty(obj)这样就没有机会发生碰撞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM