0

我一直在阅读有关 jQuery 插件的文章,并尝试以更 oop 的方式实现我们的插件。我的经理是 ac# 家伙,讨厌 jQuery UI 调用方法的方式。我想使用下面的方法,想知道您对此的看法。告诉我我正在尝试使用的优缺点。好的,这是一个简单的示例。它有工作要做,但开始:

if(typeof Object.create !== 'function')
{
    Object.create = function(o)
    {
        function F()
        {
        }
        F.prototype = o;
        return new F();
    };
}
var Car = (function()
{
    var openDoor = function(doorNum)
    {
        alert("door #" + doorNum + " opened");
    };
    return {
        openDoor: openDoor
    };
}
)();
(function($, window, document, undefined)
{
    $.fn.car = function(options)
    {
        if(this.length)
        {
            return this.each(function() {

                var myCar = Object.create(Car);
                $.data(this, 'car', myCar);

                for(var prop in Car)
                {
                    if($.fn[prop] == null)
                    {
                        $.fn[prop] = function(params)
                        {
                            return this.each(function () {
                                if($.data(this, "car") == null)
                                {
                                    throw Error("not implemented function");
                                }
                                $.data(this, "car")[prop](params);
                            }
                            );
                        };   
                    }
                }

            });
        }
    };
})(jQuery, window, document);

$("#test").on("click", function()
              {
                $("#test").car().openDoor(1).css({color: 'red'});
              });

这是小提琴链接
http://jsfiddle.net/6zHP7/8/

4

1 回答 1

1

大业!我和你的老板有同样的怪癖,我觉得 jQuery 的插件界面对于高级插件来说是不够的。

我已经为此目的启动了一个 GitHub 项目:为 jQuery 插件提供更多的 OOP API,同时保持向后兼容。

https://github.com/adamovsky/jQuery-Plugin-Pattern

我还开始写一篇与之相关的博客文章:

http://milan.adamovsky.com/2012/12/jquery-plugin-pattern-30.html

随时加入努力并做出贡献。

我在您的模式中看到的一些问题在我的模式中得到解决 - 例如使用 .data()。我看到的另一个问题是每次调用你的插件都会实例化这个类。

总而言之,这是一件雄心勃勃的事情,而且比看起来更困难,因为边缘用例很容易让你的插件崩溃和烧毁,如果不解决(正如我在早期尝试将 OOP 与 jQuery 结合时发现的那样) .

米兰

于 2012-12-28T20:01:58.167 回答