2010-08-01 96 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