Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何覆盖这个jQuery插件';什么是私人方法?_Javascript_Jquery - Fatal编程技术网

Javascript 如何覆盖这个jQuery插件';什么是私人方法?

Javascript 如何覆盖这个jQuery插件';什么是私人方法?,javascript,jquery,Javascript,Jquery,我试图重写一个方法,该方法遵循本文中引用的“jQuery轻量级插件样板”模式,但我似乎遗漏了一些东西。[编辑:结果是模式故意使方法私有。] 当我测试它时,$.fn.mbp存在。但是当我使用下面的语法覆盖它的一个方法时,没有错误,插件方法也没有被覆盖 $.fn.mbp.loadFiles = function() { alert('test') }; 该插件使用以下方法: (function ($) { function MBP() { // ... }

我试图重写一个方法,该方法遵循本文中引用的“jQuery轻量级插件样板”模式,但我似乎遗漏了一些东西。[编辑:结果是模式故意使方法私有。]

当我测试它时,
$.fn.mbp
存在。但是当我使用下面的语法覆盖它的一个方法时,没有错误,插件方法也没有被覆盖

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

该插件使用以下方法:

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

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

插件使用以下方法:

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

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

您必须确保您的代码在插件代码之后运行,从而确保它被覆盖。一种方法是登录控制台,另一种方法是使用断点并测试代码是在之前还是之后被命中。此外,我注意到您正在调用
mbp
,而链接中提到的函数是
mbp
。请注意大小写的不同。希望这有助于确保代码运行在插件代码之后,确保它被覆盖。一种方法是登录控制台,另一种方法是使用断点并测试代码是在之前还是之后被命中。此外,我注意到您正在调用
mbp
,而链接中提到的函数是
mbp
。请注意大小写的不同。希望它能帮助您,正如Tomalak所说,该函数是受到保护,但不会超出接触范围。
当它在jquery数据存储中存储mbp对象的实例时,我们可以获取该对象的构造函数并覆盖该函数

从代码行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() {
   // ...
}
$.data($('').mbp()[0],'plugin_mbp')。constructor.prototype.loadFiles=function(){
// ...
}

但是,这并不是一个非常干净的解决方案,因此您可能会想到另一种方法;)

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

从代码行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() {
   // ...
}
$.data($('').mbp()[0],'plugin_mbp')。constructor.prototype.loadFiles=function(){
// ...
}

但是,这并不是一个非常干净的解决方案,因此您可能会想到另一种方法;)

那是我的怀疑。。。对我来说,这似乎是一个愚蠢的模式!这不是完全正确的-你可以覆盖它(见我的答案)。@simesy不,这绝对不是一个愚蠢的模式。作为插件开发人员,您希望保持全局命名空间干净。这意味着您将所有内容包装在自己的范围内,这样就不会暴露出来,也不会与任何其他代码冲突。是的,我明白了。我只是不喜欢重新实现完美的插件!顺便说一句,我把你的答案投了赞成票,太棒了。这是我的怀疑。。。对我来说,这似乎是一个愚蠢的模式!这不是完全正确的-你可以覆盖它(见我的答案)。@simesy不,这绝对不是一个愚蠢的模式。作为插件开发人员,您希望保持全局命名空间干净。这意味着您将所有内容包装在自己的范围内,这样就不会暴露出来,也不会与任何其他代码冲突。是的,我明白了。我只是不喜欢重新实现完美的插件!我对你的答案投了赞成票,很好。谢谢,是的,我测试了顺序。你会注意到在接近底部的地方,插件调用$(“…”).mbp()进行初始化。谢谢,是的,我测试了顺序。您会注意到在接近底部的地方,插件调用$(“…”).mbp()进行初始化!不是很漂亮,但是对于“即时”修复程序来说很好,不需要维护一堆新代码。这个方法很有效,谢谢!不是非常漂亮,但是对于“即时”修复非常好,无需维护一堆新代码。