нерекурсивно заменять встроенные функции JavaScript - PullRequest
5 голосов
/ 18 февраля 2011

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

Допустим, я хочу заменить встроенную функцию приглашения (не обязательно в букмарклете).Это кажется достаточно легким, но есть ли способ вызвать встроенную функцию подсказки из этой замены?

prompt = function(message){
    var tmp = prompt(message);
    hook(tmp);
    return tmp;
}

Я не мог заставить область видимости работать правильно;этот пример дает бесконечную рекурсию.

Также есть способ восстановить поведение по умолчанию встроенной функции javascript, которая была заменена (без привязки к дополнительной ссылке).

1 Ответ

6 голосов
/ 18 февраля 2011
(function () {
    var old_prompt = prompt;
    prompt = function (msg) {
        var tmp = old_prompt(msg);
        hook(tmp);
        return tmp;
    };
    prompt.restore = function () { prompt = old_prompt; }
    // analogous for other functions you want to replace
})();

Оборачивая его в (самоисполняющуюся) функцию, вы гарантируете, что old_prompt не попадет наружу.Вы должны разоблачить что-то , хотя.Я решил предоставить функцию, выполняющую восстановление, для удобства и, возможно, можно сказать, будущего и инкапсуляции.Пока функции высшего порядка воздерживаются от манипуляций с чьей-либо областью действия ...

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

(Кредит на func.restore идет в Мартейн)

...