jQuery fn.extend({bla:function(){}}与jQuery.fn.bla

时间:2010-04-09 18:37:57

标签: jquery performance syntax jquery-plugins extend

好吧,我想我明白了 Difference between jQuery.extend and jQuery.fn.extend?

因为一般扩展可以扩展任何对象,而fn.extend用于插件函数,可以使用一些内部jquery voodoo直接从jquery对象调用。

所以似乎人们会以不同的方式调用它们。如果你通过添加函数y使用一般扩展来扩展对象obj,那么该方法将附加到该对象,obj.y()但是如果你使用fn.extend那么它们是 直接附加到jquery对象$ .y()....我有没有正确的是或否,如果没有,我的理解是什么?

现在我的问题:

我正在阅读的这本书主张使用

jQuery.fn.extend({
    a: function() { },
    b: function() { }
});

语法,但在文档中说

jQuery.fn.a = function() { };

我想如果你想要b也是

jQuery.fn.b = function() { };

这些在功能和性能方面是否相同,如果没有,有什么区别?

非常感谢你。我在挖jQuery!

2 个答案:

答案 0 :(得分:28)

它们之间有非常微妙的区别。性能明智(不是这是一个问题),jQuery.fn.extend比直接声明像jQuery.fn.foo = function(){ };这样的函数要慢。我说的是完全可以忽略的差异

区别在于jQuery.fn.extend()允许您同时添加多个插件功能,并且可能会使您的代码看起来更清晰一些,具体取决于您正在创作的插件类型。


jQuery.fn.a = function(){};
jQuery.fn.b = function(){};

完全相同
jQuery.fn.extend({
  a: function(){ },
  b: function(){ }
});

答案 1 :(得分:6)

两种方式几乎完全相同。但是,在以下方面存在一些小差异 -

  1. 速度
  2. 代码风格
  3. 在其他位置命名您的插件
  4. 速度

    可忽略的。您可能会忽略这一方面,因为您不太可能注意到两者之间的性能差异。

    代码风格

    扩展版本遵循Object文字代码样式,对某些人来说可能看起来更优雅。例如,如果您的插件大量使用Object文字,您可能更喜欢使用$ .extend({})包装它。

    在其他位置命名您的插件

    使用$ .fn.a样式还有另外一个(在我看来很重要)的优点 - 您可以将插件的名称存储在代码中的任何位置,然后在将插件添加到jQuery的命名空间时使用它的引用。使用对象文字扩展时无法完成此操作。这个优点有点相对于代码的长度以及插件名称的出现次数。也有人可能会说平均编码器很少改变他的插件名称,如果他这样做,在大多数情况下都不会花很长时间。

    示例

    ;(function($) {
    
        // Declare your plugin's name here
        var PLUGIN_NS = 'myPluginName';
    
        // ... some arbitrary code here ...
    
        // The jQuery plugin hook
        $.fn[ PLUGIN_NS ] = function( args ) {
    
            if ( $.type(args) !== 'object' )
                var args = {};
    
            var options = $.extend({}, $.fn[ PLUGIN_NS ].defaults, args);
    
            // iterate over each matching element
            return this.each({
                var obj = $(this);
    
                // we can still use PLUGIN_NS inside the plugin
                obj.data( PLUGIN_NS+'Data' , args );
    
                // ... rest of plugin code ...
            });
    
        };
    
        // ----------------
        // PRIVATE defaults
        // ----------------
    
        var defaults = {
            foo: 1,
            bar: "bar"
        };
    
        // ------------------------------------------------------------
        // PUBLIC defaults
        // returns a copy of private defaults.
        // public methods cannot change the private defaults var.
        // ------------------------------------------------------------
    
        // we can use PLUGIN_NS outside the plugin too.
        $.fn[ PLUGIN_NS ].defaults = function() {
            return $.extend({}, defaults);
        };
    
    })(jQuery);
    

    现在我们可以调用插件,默认情况下,如下:

    $("div#myDiv").myPluginName({foo:2});
    var originalFoo = $("div#myDiv").myPluginName.defaults().foo;
    

    要更改插件的名称,请更改 PLUGIN_NS var。 这可能比更改插件代码中每次出现的 myPluginName 更为可取。