我在使用jQuery和原生JavaScript( NOT prototype.js)时遇到问题。使用以下代码时,jQuery 1.9.1带有错误消息:
Object.prototype.myVeryGreatFunction = function() {
// ...
}
[Error] TypeError: undefined is not a function (evaluating 'U[a].exec(s)')
ft (jquery.min.js, line 4)
wt (jquery.min.js, line 4)
st (jquery.min.js, line 4)
find (jquery.min.js, line 4)
init (jquery.min.js, line 3)
b (jquery.min.js, line 3)
(anonymous function) (read.control.js, line 59)
c (jquery.min.js, line 3)
fireWith (jquery.min.js, line 3)
ready (jquery.min.js, line 3)
H (jquery.min.js, line 3)
当我删除原型定义时,一切都很好。不幸的是,我无法轻松更新jQuery,因为这是一个CMS的插件,因此出于兼容性原因,它必须使用旧版本。
是否有任何已知问题或解决方法?
谷歌搜索实际上向我展示了使用jQuery.noConflict()
和私有函数包装的解决方案。但如上所述,我没有使用prototype.js,而是原生 JS对象原型。
答案 0 :(得分:11)
您可以通过将原生原型的扩展设置为不可枚举来避免这些问题:
Object.defineProperty(Object.prototype, 'myVeryGreatFunction',{
value : function() {},
enumerable : false
});
关于MDN 的 Object.defineProperty
文档
正如Jan Dvorak所说,这个解决方案不适用于旧浏览器(IE8 - )。
答案 1 :(得分:2)
旧版浏览器中有无法安全的方式,可以在不破坏jQuery的情况下扩展Object.prototype
。 jQuery作者特别说(某处......)如果你只是向Object.prototype
添加新的可枚举属性,jQuery就会破坏。
唯一的安全方式需要ECMAScript 5及其Object.defineProperty
函数,该函数允许将不可枚举的属性添加到对象中。
jQuery noconflict()
函数没有帮助 - 它是一个完全不同的问题的解决方案。