如何修改返回DOM元素对象的所有jQuery函数使其返回额外数据?
如何修改jQuery返回的DOM元素对象以附带额外数据?
你的思路方向是对的,但存在几个关键问题:直接返回数组会丢失jQuery对象的所有方法,代码中存在未定义变量origAppliedArray,且jQuery的实际构造函数是$.fn.init而非$.fn.constructor。以下是两种可行方案,根据你的需求选择:
方案1:给DOM元素添加额外属性(推荐,不破坏原有功能)
这种方式不会改变jQuery集合的结构,只是给每个DOM元素附加num属性,既保留jQuery所有原生方法,又能获取额外数据:
(function($) { var origInit = $.fn.init; $.fn.init = function(selector, context, root) { // 调用原始构造函数获取标准jQuery实例 var $instance = new origInit(selector, context, root); // 给每个DOM元素添加num属性 $instance.each(function(index) { this.num = index + 1; // 对应你例子中的num从1开始计数 }); $instance.constructor = $.fn.init; return $instance; }; // 保持原型链一致,确保jQuery方法正常工作 $.fn.init.prototype = $.fn; })(jQuery);
测试使用:
var $divs = $('div'); console.log($divs[0].num); // 输出1 $divs[0].click(); // 原生DOM方法正常生效 $divs.find('p').each(function() { console.log(this.num); // 子元素也会带有num属性 });
方案2:将DOM元素包裹为自定义对象(需兼容jQuery方法)
如果你确实需要把每个元素替换为{索引: DOM元素, num: 数值}的结构,需要注意:这种方式会导致直接调用DOM方法(如$obj[0].click())失效,必须通过$obj[0][索引]访问原始DOM元素。代码如下:
(function($) { var origInit = $.fn.init; $.fn.init = function(selector, context, root) { var $instance = new origInit(selector, context, root); // 遍历替换每个元素为自定义对象 for (var i = 0; i < $instance.length; i++) { $instance[i] = { [i]: $instance[i], num: i + 1 }; } $instance.constructor = $.fn.init; return $instance; }; $.fn.init.prototype = $.fn; })(jQuery);
测试使用:
var $divs = $('div'); console.log($divs[0]); // 输出 {0: <div>, num: 1} $divs[0][0].click(); // 需通过索引访问原始DOM元素才能调用方法
关键说明
- jQuery的核心构造逻辑在
$.fn.init中,重写它才能覆盖所有返回jQuery集合的方法(包括$()、find、filter等)。 - 必须保持
$.fn.init.prototype = $.fn,否则jQuery的原型方法(如each、click)会失效。 - 方案1是更稳妥的选择,因为它完全兼容jQuery的所有原生功能;方案2仅适用于你明确需要自定义对象结构且能接受DOM方法调用方式改变的场景。
内容的提问来源于stack exchange,提问作者Aqacc
相关产品推荐
相关产品推荐

