是否可以将jQuery对象链接到自定义对象方法?

时间:2014-08-21 03:13:24

标签: jquery chaining

我想知道如何将$(someSelector).someObj.someMethod()这样的语法与jQuery结合使用?

理念:我不想用一堆自定义函数扩展$.fn。因此,someObj包含几种应将this解析为$(someSelector)的方法。

我知道我只能使用one custom function which execudes code depending on its argument

(function( $ ) {
    $.fn.customFunc = function( funcSelector ) {
        if ( funcSelector === "do this") {
            // do this
        }
        if ( funcSelector === "do that" ) {
            // do that
        }
    };
}( jQuery ));

所以$(someSelector).customFunc(funcSelector)是一个很好的解决方法。

但我仍然很好奇:是否有可能实现jQuery和自定义对象之间的可链接性?

更新#1:

我喜欢@jfriend00的方法。看他最后的编辑。它也基于将自定义函数名称作为字符串参数传递,但它允许将自定义函数定义为实际函数,而不是将某些代码包含在if / switch语句中。

更新#2:

在答案中查看@barmar的自定义类方法。

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

$(someSelector).someObj.someMethod()

someObj添加属性jQuery.fn,该属性是包含someObj的自有方法的对象。

jQuery.fn.someObj = {
    someMethod: function() {
        // method code here
    }
};

但是,当你这样做并像你指定为$(someSelector).someObj.someMethod()一样调用它时,this中的.someMethod()值将是someObj并且不会是jQuery对象所以这通常不是一件有用的事情,因为你无法访问jQuery对象,这通常是添加jQuery方法的原因。


如果您担心向jQuery名称空间添加太多方法,那么您可以在方法名称上使用自己的前缀,这与您最初从名称空间冲突点请求的内容没有什么不同视图(这只是在两个名称之间使用单个名称的部分之间的_而不是.

$(someSelector).myUniquePrefix_add();
$(someSelector).myUniquePrefix_remove();
$(someSelector).myUniquePrefix_modify();

尝试解决第一个方案中的this问题的任何解决方案都是混乱的,根本不值得麻烦或开销,因为Javascript不会那样工作。

例如,你可以让它像这样工作:

jQuery.fn.someObj = function(method /* other args */) {
    var args = [].slice.call(arguments, 1);
    return this.someObj[method].apply(this, args);
}

jQuery.fn.someObj.someMethod = function() {
    // method code here
}

// and then call it like this
$(someSelector).someObj("someMethod", "arg1", "arg2");

答案 1 :(得分:0)

为了完整起见,这是执行@ Barmar建议的代码:

// declare wrapper class for custom functions
function Custom() {}
// define custom functions as object methods
Custom.prototype.doThis = function() {
// do something with this.jObj
    return this.jObj;
}
Custom.prototype.doThat = function() {
    // do something with this.jObj
    return this.jObj;
}
// use jQuery's custom function interface to initialize wrapper object
$.fn.custom = function() {
    var custom = new Custom();
    custom.jObj = this;
    return custom;
};
// call your custom functions
$(selector).custom().doThis();
$(selector).custom().doThat();

我不喜欢调用的语法,因此更喜欢@jfriend00的基于参数的解决方案,但是如果你使用伪方法就可以了,那么你手边的自定义函数就有了一个很好的包装类。 / p>

编辑:在自定义()调用上创建自定义对象(请参阅@ jfriend00的评论)。