首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带函数的$.extend()

带函数的$.extend()
EN

Stack Overflow用户
提问于 2011-12-04 12:43:31
回答 3查看 17.3K关注 0票数 6

我正在编写一个jQuery插件,它需要执行回调函数,例如,当从应用插件的<select>中选择一个选项时。

我见过插件允许您在传递它的选项中定义函数,如下所示:

代码语言:javascript
复制
$('div.foo').pluginBar({ 
    option1: 'red',
    someEvent: function() {
        // Do stuff
    }
});

我希望能够在插件代码中定义默认的someEvent函数,但是如果用户在传递的选项中定义了该函数,则应该覆盖默认函数。这在$.extend()中是可能的吗,还是我找错地方了?

我看过插件创作教程,但我认为它不包括在任何地方扩展函数的默认行为。我读过关于使用init:函数的内容,但我更希望能够定义一个函数(在插件命名空间中),并使用传递给插件的选项来更改它。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-04 12:49:44

下面是一个例子:

代码语言:javascript
复制
(function( $ ) {
  $.fn.pluginBar = function(options) {
      var settings = $.extend( {
          someEvent: function() {
              alert('default');
          }
      }, options);

      return this.each(function() {
          settings.someEvent();
      });
  };
})( jQuery );

$('div.foo').pluginBar({ 
    option1: 'red',
    someEvent: function() {
        alert('custom');
    }
});

如果在连接插件时不指定someEvent,则将使用默认的插件。

票数 15
EN

Stack Overflow用户

发布于 2011-12-04 13:11:20

在javascript中,函数是一流的对象.也就是说,您可以像使用任何其他变量一样使用函数:

代码语言:javascript
复制
//making an anonymous function, and assigning it to a variable
var meep = function () {
    return 'meep';
};

//passing a function as a parameter
[ 'moop' ].map( meep ); //['meep']

//assigning it in an object literal
var weirdNoises = {
    'meep' : meep,

    'slarg' : function () {
        return 'slarg';
    }
};

weirdNoises.meep(); //'meep'
weirdNoises.slarg(); //'slarg'

//you can also return functions
function meeper () {
    return meep;
}
function slarger () {
    return function () {
        return 'slarg';
    };
}

//meeper returns a function, so the second () means "execute the function
// that was returned"
meeper()(); //'meep'
slarger()(); //'slarg'

正如您所看到的,函数与任何其他值一样。因此,您可以定义一个默认选项,它将是一个函数,并像其他任何东西一样覆盖它。

代码语言:javascript
复制
$.fn.weirdNoise = function ( options ) {
    var defaults = {
        makeNoise : function () {
            return 'Rabadabadaba';
        },
        isSilly : true
    };

    return $.extend( defaults, options );
};

var raba = $( 'foobar' ).weirdNoise().makeNoise();
raba.makeNoise(); //'Rabadabadaba'
raba.isSilly; //true

var shaba = $( 'foobar' ).wierdNoise({
    makeNoise : function () {
        return 'Shabadabadoo';
    }
});
shaba.makeNoise(); //'Shabadabadoo'
shaba.isSilly; //true

一个人为的例子,但我认为它说明了这一点。

票数 8
EN

Stack Overflow用户

发布于 2011-12-04 12:49:28

是的,您可以扩展具有函数值的对象。

代码语言:javascript
复制
var originalFunction = function() { 
    alert( 'original' );
}

var a = { 
    foo: 'bar', 
    func: originalFunction 
};

var b = { 
    foo: 'baz', 
    func: function() { 
        alert( 'ok' ); 
    } 
};

var c = $.extend( {}, a, b );

c.func();    // alerts 'ok'

在JavaScript中,函数和其他值之间通常没有实际区别,因此您可以像对待其他对象或数据类型一样对待函数。

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

https://stackoverflow.com/questions/8375357

复制
相关文章

相似问题

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