如何在插件中创建私有方法?

时间:2015-02-16 08:20:39

标签: jquery

我想知道是否可以在方法中创建一个jQuery私有方法,如下所示:

(function($) {
    $.fn.myPublicFunc = function() { 
        $.fn.myPrivateFunc = function() {    
            return this;
        };

        $("a").myPrivateFunc();

        return this;
    };
}(jQuery));

还是有另一种方法可以加入我的普通私人功能,例如:

var myPrivateFunc = function() {
}

进入jQuery链。对不起我的词汇,我希望你能理解我的观点。

2 个答案:

答案 0 :(得分:1)

有几个地方可以创建私人功能:

  1. 整个插件的一个副本

  2. 使用插件

  3. 的每个jQuery对象的副本

    我推荐#1。这是你如何做到的:

    function($) {
        $.fn.myPublicFunc = function() { 
    
            myPrivateFunc($("a"));
    
            return this;
        };
    
        function myPrivateFunc($set) {
            // Stuff using `$set` here, for instance
            $set.css("color", "green");
        }
    }(jQuery));
    

    注意私有函数的创建位置:在作用域函数中,你包含了插件的代码。只创建了该函数的一个副本,然后将jQuery集传递给它。

    在那里,$setmyPrivateFunc应该操作的jQuery集(对象)。

    如果您更愿意使用this,请使用Function#call进行调用:

    function($) {
        $.fn.myPublicFunc = function() { 
    
            myPrivateFunc.call($("a"));
    
            return this;
        };
    
        function myPrivateFunc() {
            // Stuff using `this` here, for instance
            this.css("color", "green");
        }
    }(jQuery));
    

    请注意,this是jQuery集,而不是事件回调中的DOM元素。

答案 1 :(得分:0)

为了使方法具有可链接性,它必须必然是公共的,因此不能作为对象的方法。在JavaScript中,范围是在函数级别设置的,因此myPrivateFunction仅对$.fn.myPublicFunc方法可见。

您可以在$.fn方法的范围内按照惯例定义一个函数,它可以正常工作:

(function($) {
    $.fn.myPublicFunc = function() { 
        var myPrivateFunction = function(elem) {
            return elem;
        };

        myPrivateFunction($("a"));

        return this;
    };
}(jQuery));

JavaScript函数可以覆盖其上下文,因此使用myPrivateFunction不带参数的初始目标可以使用JavaScript的本地Function.[call/apply/bind]方法或使用jQuery $.proxy方法。以下是一个如何使用原生Function.call()

的示例
var myPrivateFunction = function() {
    return this;
};

myPrivateFunction.call($("a"));

这样做的一个缺点是,myPrivateFunction 假定被调用的上下文不清楚(没有必要的文档),因此JSHint和其他JS链接器会抱怨您的模块遵守strict mode规则。