在jquery对象上使用.add
,.remove
等函数时,jQuery对象本身没有被修改,结果会被返回的新jQuery对象捕获。
有没有办法修改对象本身?
我需要这样,所以我可以用引用传递的jQuery编写一个函数,如下所示:
function DoThings(refJQuery) {
refJQuery.find(...).remove(...);
if (refJQuery.length > 0) {
DoThings(refJQuery);
}
}
重要提示:此代码示例仅提示"通过引用"传递的值的目的/用途。
答案 0 :(得分:2)
不,jQuery集合被设计为不可变的(你可以更改它们的属性,但你不应该,它们是实现的一部分,而不是API)
当您想要将不可变对象传递给函数并对其进行修改时(假设返回值不可行),组合通常是要走的路。
通常,您应该使用自定义对象。但是如果你愿意,你也可以设计一个通用装饰器:
function MutableJQueryObject(jqo){
this.jqo = jqo;
}
['add','find','filter',].forEach(function(k){
MutableJQueryObject.prototype[k] = function(){
this.jqo = $.fn[k].apply(this.jqo, arguments);
}
});
['html','remove'].forEach(function(k){
MutableJQueryObject.prototype[k] = function(){
return this.jqo[k].apply(this.jqo, arguments);
}
});
$.fn.mutable = function(){
return new MutableJQueryObject(this);
}
所以你要构建一个可变对象:
var $e = $('body').mutable();
console.log($e.html()); // html of the body
(function($c){
$c.find('div'); // change the object
})($e);
console.log($e.html()); // html of the div