Javascript中的原型对象打破了jQuery?
我在页面中添加了一个简单的.js
文件,其中添加了一些非常普通的任务类型的功能,添加到Object
和Array
原型中。
通过试验和错误,我发现在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中,然后根据需要通过call
或apply
访问它。 例如:
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