覆盖JavaScript中的“私有”功能

时间:2010-08-01 13:38:32

标签: javascript jquery jquery-ui patch

我正在修补一些jQuery的Draggable代码*。

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

函数_generatePosition的声明如下:

(function($) {

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

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


*因此它计算相对于父元素顶部的捕捉网格,而不是相对于被拖动元素的顶部。有关详细信息,请参阅here

3 个答案:

答案 0 :(得分:11)

您可以操纵个别实例:

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

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

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

答案 1 :(得分:3)

编辑以下评论:看来你可以编辑这些(在最后一个小部件重写之后),但我仍然会明确指出。 Here's an example of the base method,如果您愿意,可以从那里进行修改,但请记住,可以在将来的版本中破解。此外,窗口小部件的任何“继承者”都不会接收这些更改,也不确定这是否是一个问题。


至于原因,拒绝你访问并不是真正的原因(不是在这种情况下)。在像这样的图书馆案例中,它更干净而不是拒绝你访问,因为图书馆可能希望稍后更改架构,并且当他们这样做时仍然尽可能少地打破...让你只有访问其代码的“公共”成员才能使作者更灵活地更改任何“私有”。

一个例子:jQuery UI 1.8将大量代码移动到position utility中,允许很多私有代码清理,你没有看到发生,因为它之前都是私有的,这允许一个相当大的优化/代码减少而不会让人左右分开。

答案 2 :(得分:3)

你可以实际修改这些,但据我所知,只能在每个元素的基础上修改。但是你可以轻松地创建自己的$ .fn.draggable包装器,只需调用原始包装器并运行它:draggableElement.data('draggable')._generatePosition = fn

  • 正如JörnZaefferer所指出,您还可以使用$.ui.draggable.prototype._generatePosition = fn
  • 修改可拖动的原型