2015-09-14 85 views
0

我试图覆盖this jQuery plugin中的一个方法,该方法遵循在Smashing Magazine article中引用的“jQuery轻量级插件样板”模式,但是我似乎错过了一些东西。 [编辑:原来的模式故意使该方法私人。]如何覆盖这个jQuery插件的私有方法?

$.fn.mbp存在,当我测试它。但是,当我使用以下语法重写其方法之一时,没有错误,并且插件方法未被覆盖。

$.fn.mbp.loadFiles = function() { 
    alert('test') 
}; 

回答

2

正如Tomalak说,他们的功能受到保护,但它不是遥不可及。
因为它将mbp对象的实例存储在jquery数据存储中,所以我们可以获取此对象的构造函数并覆盖该函数。

从你的代码行360:

$.fn[pluginName] = function (options) { 
    return this.each(function() { 
     if (!$.data(this, 'plugin_' + pluginName)) { 
     $.data(this, 'plugin_' + pluginName, 
      new MBP(this, options)); 
     } 
     else { 
     if (options == 'options') { 
      return $.data(this, 'plugin_' + pluginName).options; 
     } 
     } 
    }); 
    } 

覆盖它:

$.data($('<div/>').mbp()[0], 'plugin_mbp').constructor.prototype.loadFiles = function() { 
    // ... 
} 

然而,这是不是一个真正的非常干净的解决方案,所以你可能会想别的办法;)

+0

此方法有用,谢谢!不是非常漂亮,但对于“及时”修复非常有用,无需维护大量新代码。 – simesy

+0

你是对的!没想到这一点。 – Tomalak

1

插件使用该appoach:

(function ($) { 
    function MBP() { 
     // ... 
    } 
    MBP.prototype.loadFiles = function() { 
     // ... 
    }; 
    $.fn.mbp = function() { 
     return this.each(function() { 
      var mbp = new MBP(); 
      // ... 
     }); 
    }; 
})(jQuery) 

底线:由于封闭功能,MBP构造函数是私有的。你不能修改它(至少不需要修改插件的源代码)。

+0

这是我的怀疑......这对我来说似乎是一个愚蠢的模式! – simesy

+0

这是不完全正确的 - 你可以覆盖它(见我的答案)。 – jantimon

+0

@simesy不,它绝对不是一个愚蠢的模式。作为一名插件开发人员,您希望保持全局名称空间的清洁。这意味着你将所有的东西包装在它自己的范围内,这样它就不会被暴露,也不会与任何其他代码发生冲突。 – Tomalak

0

您必须确保您的代码在插件代码之后运行,从而确保它被覆盖。这样做的一种方式是登录您的控制台,另一个方法是使用中断点和测试是否在您之前或之后点击您的代码。另外,我注意到您正在调用mbp,而链接中提到的功能是MBP.Notice案例difference.Hope它有帮助

+0

谢谢,是的,我测试了订单。你会注意到插件底部附近调用$('...')。mbp()来初始化。 – simesy