2010-08-01 49 views
12

我正在修补一些jQuery的Draggable代码*。在JavaScript中覆盖“private”函数

目标是避免修改原始源文件并动态修补其中一个内部函数。

功能_generatePosition声明如下:

(function($) { 

    $.widget("ui.draggable", $.ui.mouse, { 
     ... 
     _generatePosition: function(event) { 
      ... 
     } 
    } 
})(jQuery); 

是否有可能实现动态替换呢?


*所以,相对于父元素的顶部捕捉网,而不是相对于元素的顶部计算被拖动。有关更多详细信息,请参见here

回答

11

你可以操纵单个实例:

.draggable().data("draggable")._generatePosition = function() {}; 

或修改原型,影响所有实例:

$.ui.draggable.prototype._generatePosition = function() {}; 
+0

修改原型绝对是胜过.data(),谢谢! – Art 2010-08-03 10:30:25

+1

我真的很喜欢在框架(如WordPress)中工作时的实例操作,在这个框架中,您不知道其他进程可能依赖于Draggable的工作原理。 – 2011-11-30 17:28:12

+0

有铜牌。 – 2017-05-02 01:31:37

3

编辑下面评论:看来可以您编辑这些(最后一个部件重写后),但我仍然会避开。 Here's an example of the base method,如果你愿意,你可以从那里修改,但请记住这个在未来的版本中可能并且可能会打破。此外,小部件的任何“继承者”都不会接受这些更改,不确定这是否是一个问题。


至于原因,否认你的访问不是真正的原因(在这种情况下)。在像这样的图书馆案例中,更多的是清洁而不是拒绝你访问,,因为图书馆可能希望稍后更改体系结构,并且尽可能少的人破坏......让你只访问“公共“他们的代码成员赋予作者更改”私人“任何东西的灵活性。示例:jQuery UI 1.8将大量代码移动到position utility中,允许大量私有代码清理,但您没有看到发生,因为它在所有私有代码之前都允许进行相当大的优化/代码缩减没有打破左右的人。

+1

它有一个领先的下划线,所以应该被视为私人...但你确定你不能挖掘对象,并将属性设置为不同的功能?它不是像[this](http://www.crockford.com/javascript/private.html)这样的私人...? – sje397 2010-08-01 13:53:42

+2

@ sje397 - 它不仅是前面的'_',而且是私有的(通过图书馆非常一致)。它被传递给小部件创建者,它将不同的私有方法分配给对象(再次,他们*如何做)。如果你看看代码,那就是为什么它必须通过'this._generatePosition'调用:) – 2010-08-01 13:57:25

+0

如果你可以访问它们,但它们并不是真正的私有的(见我的其他帖子),它们只是更难以访问:) – peol 2010-08-02 14:19:59

3

您可以实际修改这些,但只能在每个元素上进行修改,据我所知。但是你可以很容易地创建自己的$ .fn.draggable包装,并调用原包装,并运行此:draggableElement.data('draggable')._generatePosition = fn

  • 作为乔恩Zaefferer指出的那样,你也可以修改拖动原型,通过使用$.ui.draggable.prototype._generatePosition = fn