【问题标题】:Why use jQuery plugins over javascript functions?为什么使用 jQuery 插件而不是 javascript 函数?
【发布时间】:2014-12-09 18:32:02
【问题描述】:

为什么要使用 jQuery 插件而不是传统的 javascript 函数?我看到的唯一区别是您需要将一个 jQuery 对象传递给 js 函数……除此之外,我看不出有很大的不同,因为似乎两者都可以在类似的步骤中完成相同的事情:

        $(document).ready(function () {
            $('p').jQuery_greenify();
            greenify($('p'));
        });

        $.fn.jQuery_greenify = function () { 
            this.css("color", "green");
        };

        function greenify (el) {
            el.css("color", "green");
        }

我还发现使用 javascript 函数更容易命名空间:

        var mynamespace = {

            greenify : function (el) {
                el.css("color", "green");
            }
        }
        mynamespace.greenify($('p'));

【问题讨论】:

  • 为什么要关闭?这似乎是一个很好的客观问题,已经获得了客观答案(方法链等......)

标签: javascript jquery function


【解决方案1】:

通常,JQuery 函数的用处在于链接它们。就像你想打电话一样:

string.substring(2, 5).startsWith("lol")

而不是

Util.StartsWith(Util.substring(string, 2, 5), "lol")

这样更容易阅读。事实上,我认为第二个函数可能仍然需要“返回 this”才能有用?

这可能取决于上下文 - 一些操作与一个元素或一组元素非常相关,而另一些则独立存在更有意义 - 因此,您的命名空间方法会很好。这是部分编码风格。

免责声明 - 我没有编写 JQuery 插件的经验,这只是我基于 JS 语言设计的一般观察。

【讨论】:

  • @Growler 您仍然需要从 jQuery 方法返回 this 以保持链接。任何功能都可以做到这一点
  • 如果你正在制作一个插件,但你没有处理一些 jquery 对象,那么你究竟会链接什么?换句话说,在我更简单的示例中,string 对象的等价物是什么?
  • @Katana314 我看不出在非 jq 对象上调用 jq 方法有任何意义,我可能是错的
  • @A.Wolff 是的,我同意这一点 - 我的问题是针对 Growler 的。
【解决方案2】:

始终是 jQuery 对象

当你说使用 plugin 时(它实际上是一个对象原型)你确定 this 将是一个 jQuery 对象,因为你不能在没有 jQuery 对象的情况下调用它 except 如果您使用.call.apply.bind 等来解决问题。

同时,您可以将任何内容传递给函数,因此参数可能不是 jQuery 对象并会引发错误。

链接时的可读性

你可以用这两种方法链接函数,但老实说,使用 jQuery 原型,它更漂亮:

$.fn.jQuery_greenify = function () { 
    return this.css("color", "green");
};

$('div').jQuery_greenify().append(...);

//VS

function greenify (el) {
    return el.css("color", "green");
}

greenify($('div')).append(...);

范围

在原型中添加一个函数时,无论你在哪个作用域,它都可以在任何地方访问。这允许你创建一个特定的闭包:

(function(){
    $.fn.jQuery_greenify = function () { 
        return this.css("color", "green");
    };
})();

$('div').jQuery_greenify(); //Work

//VS

(function(){
    function greenify (el) {
        return el.css("color", "green");
    }
})();

greenify($('div')); //Undefined is not a function error

【讨论】:

    【解决方案3】:

    jQuery 最初的用处是为诸如 DOM 操作和 AJAX 之类的东西提供一致的 API - [旧] 浏览器实现的东西非常不同。用 1 到 2 行 jQuery 可以完成的工作需要 20 多行代码。它抽象出所有不一致的地方,因此您可以专注于编码。

    然后,John Resig 最可怕的噩梦发生了,人们现在认为 jQuery 是一种语言,几乎独立于 Javascript。 </rant>

    如今,大多数浏览器都采用了标准,除非您尝试支持 担心不一致。您可以使用下划线之类的东西来帮助利用较新的 javascript 功能(对即使在当今的浏览器中仍然不一致实现的东西具有向后兼容性)。

    关于插件,优点是有一致的方式来实现可重用的代码。例如,我有点不同意您创建命名空间的方式(不是真的,但我会以不同的方式做)。

    重点是,这都是 javascript。学习 JavaScript。如果在不使用库的情况下更容易、更快捷地做到这一点,那么一定要去做!关注社区并尝试使用其他人采用的技术……即使偶尔意味着使用库。

    注意:如果有人将 jQuery 放在简历的“语言”部分,请将其扔进垃圾桶。

    【讨论】:

    • 是的,我发帖后才意识到我没有直接解决插件问题……所以我写了一行。总的来说,评论适用于任何 jQuery - 包括插件。
    猜你喜欢
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多