首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >jQuery函数({bla: fn.extend (){}})与jQuery.fn.bla

jQuery函数({bla: fn.extend (){}})与jQuery.fn.bla
EN

Stack Overflow用户
提问于 2010-04-10 02:37:57
回答 2查看 10.8K关注 0票数 18

好的,我想我理解Difference between jQuery.extend and jQuery.fn.extend?了。

因为一般扩展器可以扩展任何对象,而fn.extend是用于插件函数,这些插件函数可以直接从jquery对象调用,并且可以使用一些内部jquery巫术来调用。

因此,似乎有人会以不同的方式调用它们。如果使用常规扩展通过添加函数y来扩展对象obj,则该方法将附加到对象obj.y(),但如果使用fn.extend,则它们将直接附加到jquery对象$.y()...我是否得到了正确的是或否,如果不是,我的理解有什么错误?

现在我的问题是:

我正在读的这本书提倡使用

代码语言:javascript
复制
jQuery.fn.extend({
    a: function() { },
    b: function() { }
});

语法,但在文档中它说

代码语言:javascript
复制
jQuery.fn.a = function() { };

我猜如果你也想要b,那就是

代码语言:javascript
复制
jQuery.fn.b = function() { };

它们在功能和性能方面是否等效,如果不是,区别是什么?

非常感谢。我在挖jQuery!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-10 02:42:19

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

不同的是,jQuery.fn.extend()允许你同时添加多个插件函数,并且可能会让你的代码看起来更干净一些,这取决于你创作的插件类型。

代码语言:javascript
复制
jQuery.fn.a = function(){};
jQuery.fn.b = function(){};

完全相同于

代码语言:javascript
复制
jQuery.fn.extend({
  a: function(){ },
  b: function(){ }
});
票数 28
EN

Stack Overflow用户

发布于 2012-06-13 03:01:53

这两种方式几乎是相同的。然而,在以下几个方面存在一些小的差异-

  1. Speed
  2. Code style
  3. Naming你的插件elsewhere

速度

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

代码样式

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

将您的插件命名为别处

使用$.fn.a风格还有另一个(在我看来很重要)的好处--你可以将插件的名字存储在代码中的任何地方,然后在将插件添加到jQuery的命名空间时使用它的引用。当使用对象文字进行扩展时,无法做到这一点。这一优势在某种程度上与您的代码长度和插件名称出现的次数有关。有人可能会争辩说,普通的程序员很少更改他的插件的名称,即使他这样做了,在大多数情况下也不会花很长时间。

示例:

代码语言:javascript
复制
;(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);

现在我们可以调用插件,并使用默认值,如下所示:

代码语言:javascript
复制
$("div#myDiv").myPluginName({foo:2});
var originalFoo = $("div#myDiv").myPluginName.defaults().foo;

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2609951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档