Переопределите “частную” функцию в JavaScript

Я - исправление обезьяны некоторые Перемещаемые code* jQuery.

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

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

(function($) {

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

Действительно ли возможно достигнуть динамической замены его?


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

12
задан Community 23 May 2017 в 12:26
поделиться

3 ответа

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

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

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

$.ui.draggable.prototype._generatePosition = function() {};
11
ответ дан 2 December 2019 в 19:52
поделиться

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


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

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

3
ответ дан 2 December 2019 в 19:52
поделиться

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

  • Как отметил Jörn Zaefferer, вы также можете изменить прототип draggable, используя $.ui.draggable.prototype._generatePosition = fn
3
ответ дан 2 December 2019 в 19:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: