能否对jQuery对象进行作用域限定?如何隔离作用域改写内部函数?
给jQuery对象做作用域隔离,重写方法不影响全局
嘿,我完全懂你想要实现的效果——给jQuery搞个专属作用域,在这个范围内重写已经扩展的函数,同时外面全局的原有函数还能正常用,不受影响对吧?你之前尝试没成功,大概率是因为直接修改了全局的jQuery原型/方法,导致所有地方都受影响了。下面给你两种靠谱的实现方案:
方案1:使用jQuery.sub()(适用于jQuery 1.5-2.x版本)
jQuery原生提供了$.sub()方法,它会创建一个独立的jQuery子副本,这个副本的方法和全局jQuery完全隔离,修改副本的方法不会影响全局:
// 创建独立的jQuery作用域副本 var scopedJQuery = jQuery.sub(); // 假设你之前给全局jQuery扩展了一个myPlugin方法 jQuery.fn.myPlugin = function() { console.log("全局的原始方法"); return this; }; // 在专属作用域内重写这个方法 scopedJQuery.fn.myPlugin = function() { console.log("作用域内重写后的方法"); return this; }; // 测试效果 scopedJQuery("#myElement").myPlugin(); // 输出:作用域内重写后的方法 jQuery("#myElement").myPlugin(); // 输出:全局的原始方法
这个方法的好处是简单直接,原生支持,但要注意:jQuery 3.0及以上版本已经移除了$.sub(),所以如果你的项目用的是高版本jQuery,得用下面的方案。
方案2:手动创建独立jQuery副本(适用于所有jQuery版本)
如果是高版本jQuery,我们可以用闭包自己封装一个独立的jQuery构造函数,实现和$.sub()类似的隔离效果:
(function() { // 定义一个专属的jQuery构造函数 function ScopedjQuery(selector, context) { return new ScopedjQuery.fn.init(selector, context); } // 复制全局jQuery的原型方法到新构造函数 ScopedjQuery.fn = ScopedjQuery.prototype = jQuery.extend({}, jQuery.fn); // 重新初始化init方法,确保上下文指向我们的专属构造函数 ScopedjQuery.fn.init = function(selector, context) { return jQuery.fn.init.call(this, selector, context, ScopedjQuery); }; // 让init的原型指向专属构造函数的原型,保证链式调用正常 ScopedjQuery.fn.init.prototype = ScopedjQuery.fn; // 现在可以在这个专属作用域内重写方法了 ScopedjQuery.fn.myPlugin = function() { console.log("专属作用域的重写方法"); return this; }; // 测试调用 ScopedjQuery("#test").myPlugin(); // 输出:专属作用域的重写方法 jQuery("#test").myPlugin(); // 输出:全局的原始方法 // 如果需要在外部访问这个专属jQuery,可以把它挂载到全局或者你指定的作用域 window.ScopedjQuery = ScopedjQuery; })();
额外说明:隔离全局jQuery方法(比如$.ajax)
如果你的需求是重写全局级别的jQuery方法(比如$.ajax而不是$.fn上的方法),同样可以在副本上修改:
// 以方案1的scopedJQuery为例 scopedJQuery.ajax = function(options) { console.log("作用域内的ajax请求拦截"); // 可以调用全局jQuery的ajax方法做基础处理 return jQuery.ajax(options); }; // 调用scopedJQuery.ajax会用重写后的逻辑,全局$.ajax不受影响 scopedJQuery.ajax({url: "/api"}); $.ajax({url: "/api"});
核心思路就是创建一个和全局jQuery完全独立的副本,所有修改都只作用在这个副本上,这样就不会干扰全局的jQuery功能啦。
内容的提问来源于stack exchange,提问作者Troublesum
相关产品推荐
相关产品推荐

