Javascript 重写jQuery.end()方法以接受参数

Javascript 重写jQuery.end()方法以接受参数,javascript,jquery,Javascript,Jquery,更新 当前的解决方案基于这一要点,以防您需要此类功能 我正在做一个小实验,尝试用我自己的方法覆盖jQuery的核心端方法,该方法本质上只是为jQuery添加了功能 例如,如果您正在使用jQuery,您可能会执行以下操作 $('h1.clickme').click(function () { $(this).next('div').css("width", "+=200").parent().next().hide().end().end() //this should t

更新 当前的解决方案基于这一要点,以防您需要此类功能

我正在做一个小实验,尝试用我自己的方法覆盖jQuery的核心端方法,该方法本质上只是为jQuery添加了功能

例如,如果您正在使用jQuery,您可能会执行以下操作

$('h1.clickme').click(function () {
     $(this).next('div').css("width", "+=200").parent().next().hide().end().end()
      //this should traverse you back to the div after the h1 clicked
})
$('.promo-carousel').parent().prev().siblings('span').hide().end(2)
if (!(arguments.length) || (typeof no_of_times !== "number")) {
            return this.prevObject || this.constructor(null);
        } else {
            for (i=0; i <= no_of_times; i++) {
                pObj += "prevObject."           
            }
            var prevObject = pObj.slice(0, prevObject.length -1)
            console.log(prevObject);
            return this.prevObject
        }

    }
我希望通过添加添加数字参数的功能来覆盖jQuery end方法 比如说

.end(1) 
我也会这样做

.end().end()
这是我到目前为止所拥有的

(function(){

// Define overriding method.
jQuery.fn.end = function(no_of_times){
    var prevObject = "prevObject";
    if (!(arguments.length) || (typeof no_of_times !== "number")) {
        return this.prevObject || this.constructor(null);
    } else {
        if (no_of_times == 1) {
            return this.prevObject.prevObject || this.constructor(null)
        } else if (no_of_times == 2) {
            return this.prevObject.prevObject.prevObject || this.constructor(null)  
        } else if (no_of_times == 3) {
            return this.prevObject.prevObject.prevObject.prevObject || this.constructor(null)
        } else {
            //too many times can't type anymore
            return this.prevObject || this.constructor(null);
        }           
    }

}
})()
所以我可以称之为这样的事情

$('h1.clickme').click(function () {
     $(this).next('div').css("width", "+=200").parent().next().hide().end().end()
      //this should traverse you back to the div after the h1 clicked
})
$('.promo-carousel').parent().prev().siblings('span').hide().end(2)
if (!(arguments.length) || (typeof no_of_times !== "number")) {
            return this.prevObject || this.constructor(null);
        } else {
            for (i=0; i <= no_of_times; i++) {
                pObj += "prevObject."           
            }
            var prevObject = pObj.slice(0, prevObject.length -1)
            console.log(prevObject);
            return this.prevObject
        }

    }
但显然,我不认为写出所有这些if语句是有效的 有没有更简单的方法?我确信性能差不多,但为了可读性,我做得更多

我考虑根据传递的参数将prevObject字符串附加到prevObject变量中,如下所示

$('h1.clickme').click(function () {
     $(this).next('div').css("width", "+=200").parent().next().hide().end().end()
      //this should traverse you back to the div after the h1 clicked
})
$('.promo-carousel').parent().prev().siblings('span').hide().end(2)
if (!(arguments.length) || (typeof no_of_times !== "number")) {
            return this.prevObject || this.constructor(null);
        } else {
            for (i=0; i <= no_of_times; i++) {
                pObj += "prevObject."           
            }
            var prevObject = pObj.slice(0, prevObject.length -1)
            console.log(prevObject);
            return this.prevObject
        }

    }
但是上面的代码片段不起作用
我们将一如既往地感谢您的帮助

这应该可以做到:

var prevObject = this.prevObject;

for(i = 1; i<no_of_times; i++) {
    prevObject = prevObject.prevObject;
    if(!prevObject) {
        prevObject = this.constructor(null);
        break
    }
}

只需在循环的每次迭代中获取prevObject的prevObject,直到找不到prevObject为止。

这应该可以做到:

var prevObject = this.prevObject;

for(i = 1; i<no_of_times; i++) {
    prevObject = prevObject.prevObject;
    if(!prevObject) {
        prevObject = this.constructor(null);
        break
    }
}

只需在循环的每次迭代中获取prevObject的prevObject,直到找不到prevObject为止。

类似的方法应该可以工作

var prevObject = this.prevObject;
for(i = 0; i<no_of_times; i++) {
    prevObject = prevObject.prevObject;
}
return prevObject || this.constructor(null);

类似的方法应该会奏效

var prevObject = this.prevObject;
for(i = 0; i<no_of_times; i++) {
    prevObject = prevObject.prevObject;
}
return prevObject || this.constructor(null);

您可以重新使用要重写的旧方法:

(function($){
    var oldfn = $.fn.end;
    $.fn.end = function(times){
        times = times || 1; // default to 1 if nothing or 0 is passed in
        var ret = this;
        for (i=0;i<times;i++) {
            ret = oldfn.call(ret);
        }
        return ret;
    };
})(jQuery);

您可以重新使用要重写的旧方法:

(function($){
    var oldfn = $.fn.end;
    $.fn.end = function(times){
        times = times || 1; // default to 1 if nothing or 0 is passed in
        var ret = this;
        for (i=0;i<times;i++) {
            ret = oldfn.call(ret);
        }
        return ret;
    };
})(jQuery);
以下是我的解决方案: 您不必重新实现任何逻辑或跟踪以前的元素:

(function($){
    var originalEnd = $.fn.end;
    $.fn.end = function(n){
        if(!n)
            return originalEnd.call(this);
        return $.fn.end.call(originalEnd.call(this), n-1);
    }
})(jQuery);
以下是我的解决方案: 您不必重新实现任何逻辑或跟踪以前的元素:

(function($){
    var originalEnd = $.fn.end;
    $.fn.end = function(n){
        if(!n)
            return originalEnd.call(this);
        return $.fn.end.call(originalEnd.call(this), n-1);
    }
})(jQuery);

仔细的我很确定,prevObject不是一个文档化的特性。为什么不缓存原始文件。以不同的名称结束,然后调用它?或者更好,为你的自定义方法使用一个不同的名称。同意-没有理由重写。如果插件和新方法可以的话结束。是的,你可能是对的-我只是想我正在向它添加功能,而不是真的重写它,所以无论你是否添加了参数,它都会以同样的方式工作。。。我很确定,prevObject不是一个文档化的特性。为什么不缓存原始文件。以不同的名称结束,然后调用它?或者更好,为您的自定义方法使用不同的名称。同意-没有理由重写。如果插件和新方法可以,则结束。是的,您可能是对的-我只是在想我正在向它添加功能,而不是真正重写它,所以无论您是否添加了参数Hanks Elliot,它都会以相同的方式工作-我知道我是缺少一些小的意义只是存储这个。prevObject在变量中是最好的解决方案感谢Elliot的工作-我知道我缺少一些小的意义只是存储这个。prevObject在变量中是最好的解决方案感谢答案-它非常接近Elliot的版本,但可读性更简单,我一直很欣赏因此,我给出了答案——它与埃利奥特的版本非常接近,但可读性更简单,这一点我一直很欣赏,所以我给出了非常酷的区域,我甚至没有想过这样做;非常好-我在这里稍微整理了一下你的语法非常酷的gion,我甚至没有想过要这样做;非常好-我在这里稍微整理了一下你的语法