Javascript中的原型对象打破了jQuery?

我在页面中添加了一个简单的.js文件,其中添加了一些非常普通的任务类型的功能,添加到ObjectArray原型中。

通过试验和错误,我发现在Object.prototype中添加了任何函数,不管它的名字是什么,或者它在jQuery中导致Javascript错误:

罪魁祸首?

Object.prototype.foo = function() {
    /*do nothing and break jQuery*/
};

我在attr:function {}声明中得到了jquery-1.3.2.js第1056行的错误:

/*Object doesn't support this property or method*/
name = name.replace(/-([a-z])/ig, function(all, letter) {
            return letter.toUpperCase();
        });

显然G.replace是未定义的。

虽然很明显,我只是没有用原型设计来包装我的头脑,但我很失败地弄清楚它是什么。

要清楚,我不是在寻找解决方法,我已经处理了...我在寻找的是对为什么的答案 。 为什么向Object.prototype添加一个函数会破坏这段代码?


你永远不应该扩展Object.prototype 。 它远不止于jQuery; 它完全打破了Javascript的“对象 - 哈希表”功能。 不要这样做。

你可以问John Resig,他会告诉你同样的事情。


如果它只是一个混乱的情况...在循环中,你不能使用Object.defineProperty添加你的FN而不使它枚举?

所以:

Object.defineProperty(Object.prototype, "foo", { 
    value: function() {
        // do stuff
    },
    enumerable : false
});

似乎为我工作。 这仍然被认为是不好的形式?


我同意,向Object.prototype添加一些Object.prototype需要谨慎,应该避免。 寻找其他解决方案,例如:

将其添加到Object中,然后根据需要通过callapply访问它。 例如:

Object.foo = function () { return this.whatever()}

然后通过以下方式在对象上调用它:

Object.foo.call(Objname);  // this invokes the function as though it were a
                           // method of Objname.  That is, its like Objname.foo()

为了好玩,你可以添加以下内容(是的,我知道它有点危险......):

Function.using = Function.call; // syntactic sugar

现在你可以编写Object.foo.using(Objname)并且它看起来像一个转折点。

但作为一项规则,远离改变任何大型原型。

链接地址: http://www.djcxy.com/p/3171.html

上一篇: Prototyping Object in Javascript breaks jQuery?

下一篇: How to measure time taken by a function to execute