javascript覆盖jQuery(或任何其他对象)的方法

时间:2013-08-30 15:11:49

标签: javascript javascript-events javascript-objects

在此 jsfiddle 中,作者为某些自定义挖空绑定编写测试。作为测试的一部分,似乎他/她扩展了jquery。

我对行30. $.fn.on = function(event, callback) {的理解是否覆盖了它,而没有随后清理jQuery可能在其原型上定义为on的任何内容?第36行和fadeOut的问题相同。

这是相关的片段,您可以检查小提琴以寻找清理

30. $.fn.on = function(event, callback) {
31.   ...
...
36. $.fn.fadeOut = function(speed, callback) {
37.   ...

我一般都在询问,与jquery没有直接关系(即jquery可能会或可能没有onfadeOut的任何内容。)我正在考虑在生产代码中嵌入类似的测试而且我不喜欢我希望我的测试改变jQuery或任何“真实”对象,我的测试可能会触及这种方式。在这方面,似乎即使有清理,其他一些事件驱动(异步)调用也可能会在更改的实现上发现 -​​ 我是对的吗?

2 个答案:

答案 0 :(得分:1)

它不仅覆盖了原型中定义的任何东西,它实际上取代了它。 $.fn属性是jQuery对象原型的副本,因此$.fn是实际原型,即$.fn === jQuery.prototype

你是对的,你不能将这种改变与你自己的对象调用隔离开来,只要你的改变生效,它也会影响调用该对象的任何其他代码。

但是,由于jQuery是严格单线程的,您可以更改原型,使用该对象然后更改原型,并且不会影响其他代码。只要您的代码没有中断运行,就不会处理任何事件。

答案 1 :(得分:0)

是的,它会覆盖jQuery的原型。它没有扩展任何内容,$.fn是jQuery原型的别名(line 54 of core.jsjQuery.fn = jQuery.prototype = {...}),因此覆盖$.fn.on会破坏jQuery。

在此处观看日志:http://jsfiddle.net/LzGmJ/