Подтвердить что ты не робот

Переопределить функцию "private" в JavaScript

Я обезьяна исправляю часть кода jQuery Draggable *.

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

Функция _generatePosition объявляется следующим образом:

(function($) {

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

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


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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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


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

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

Ответ 3

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

  • Как отметил Jörn Zaefferer, вы также можете изменить прототип перетаскивания, используя $.ui.draggable.prototype._generatePosition = fn