Переопределить «приватную» функцию в JavaScript - PullRequest
12 голосов
/ 01 августа 2010

Я исправляю некоторые из перетаскиваемых кодов jQuery *.

Цель состоит в том, чтобы избежать изменения исходных файлов и динамически исправлять одну из внутренних функций.

Функция _generatePosition объявлена ​​так:

(function($) {

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

Возможно ли добиться его динамической замены?


* Таким образом, он вычисляет привязывающую сетку относительно вершины родительского элемента, а не относительно вершины перетаскиваемого элемента. Подробнее см. здесь .

Ответы [ 3 ]

11 голосов
/ 02 августа 2010

Вы можете управлять отдельными экземплярами:

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

Или изменять прототип, затрагивая все экземпляры:

$.ui.draggable.prototype._generatePosition = function() {};
3 голосов
/ 01 августа 2010

На самом деле вы можете изменить их, но, насколько я знаю, только для каждого базового элемента.Но вы можете легко создать свою собственную оболочку $ .fn.draggable, просто вызвать оригинальную оболочку и запустить ее так: draggableElement.data('draggable')._generatePosition = fn

  • Как указал Йорн Зафферер , вы могли бытакже измените перетаскиваемый прототип, используя $.ui.draggable.prototype._generatePosition = fn
3 голосов
/ 01 августа 2010

Изменить для комментариев ниже: Кажется, вы можете редактировать их (после перезаписи последнего виджета), но я все равно держусь подальше. Вот пример базового метода , вы можете изменить его там, если хотите, но имейте в виду, что может и, вероятно, сломает в будущем выпуске.Кроме того, любые «наследники» виджета не будут воспринимать эти изменения, не будучи уверенными в том, что это проблема.


Что касается причины, отказать вам в доступе не является причиной на самом деле (не вэтот случай).В таких случаях библиотеки должны быть более чистыми, чем отказывать вам в доступе, или , потому что библиотека может захотеть изменить архитектуру позже, и все же сломать как можно меньше людей, когда они делают это ... позволяя вам толькодоступ к «открытым» членам их кода дает авторам больше гибкости в изменении всего, что является «частным».

Пример: jQuery UI 1.8 перенес большую часть кода в утилиту position позволяя выполнять большую часть очистки частного кода, чего вы не видели, поскольку до того, как это стало возможным, была проведена довольно большая оптимизация / сокращение кода без разбивки людей налево и направо.

...