2016-09-28 62 views
3

我正在寻找扩大引导插件的正确方法,并发现了这样的回答:https://stackoverflow.com/a/12689534/1276032什么可能是使用jQuery.extend重写函数的原因?

什么困扰我,是最后一节 - 初始化覆盖。下面复制的代码:

// override the old initialization with the new constructor 
$.fn.modal = $.extend(function(option) { 

    var args = $.makeArray(arguments), 
     option = args.shift(); 

    return this.each(function() { 

     var $this = $(this); 
     var data = $this.data('modal'), 
      options = $.extend({}, _super.defaults, $this.data(), typeof option == 'object' && option); 

     if (!data) { 
      $this.data('modal', (data = new Modal(this, options))); 
     } 
     if (typeof option == 'string') { 
      data[option].apply(data, args); 
     } 
     else if (options.show) { 
      data.show.apply(data, args); 
     } 
    }); 

}, $.fn.modal); 

我不明白为什么$ .extend在这种情况下使用 - 它有一定的效果,我没有看到?如果我执行此代码:

var f1 = function(){console.log(1);}; 
var f2 = function(){console.log(2);}; 
var f2 = $.extend(f1,f2); 
f2(); 

然后只有1被打印到控制台,并且f1等于f2。所以,看似简单assingnment会做,

$.fn.modal = function(option) {...} 

但也许我错过了什么......

回答

0

您需要更改此:

$.fn.modal = $.extend(function(option) { 
    // your code ... 
}, $.fn.modal); 

此:

$.extend($.fn.modal, function(option) { 
    // your code ... 
}); 

TL; DR

$.extend(a, b)个拷贝b一个修改它的内容)的内容,并且如果任何重复的,那么的b遗体的性质。此外,它返回值a

所以,如果你有这样的:

hello = { unique_on_hello: 'hola', message: 'hello message' } 
world = { unique_on_world: 'mundo', message: 'WORLD MESSAGE' } 
response = $.extend(hello, world) 

每一个值将是:

hello // {unique_on_hello: "hola", message: "WORLD MESSAGE", unique_on_world: "mundo"} 
world // {unique_on_world: "mundo", message: "WORLD MESSAGE"} 
response // {unique_on_hello: "hola", message: "WORLD MESSAGE", unique_on_world: "mundo"} 

所以,如果你做f2 = $.extend(f1,f2);相同

$.extend(f1, f2) // Copy properties of f2 to f1 
f2 = f1 

来源:https://api.jquery.com/jquery.extend/

+1

Thx回复。我知道如何为对象扩展工作。我的问题的线索与一个案例有关,当函数作为参数传递时。你的建议(改变'f2 = $ .extend(f1,f2)'为'$ .extend(f2,f1)')并不能真正回答我的问题,因为我不想改变任何东西 - 我只想学习,为什么这个代码是一个公认的,并且实际上相当有争议的答案的一部分(目前32个upvotes)。此外 - 改变这个代码仍然没有扩展任何东西。结果始终是第一个参数的函数。 –

相关问题