Hook.js

Javascript function hook

이 스크립트는 직접 설치하는 용도가 아닙니다. 다른 스크립트에서 메타 지시문 // @require https://update.greasyfork.org/scripts/443030/1037826/Hookjs.js을(를) 사용하여 포함하는 라이브러리입니다.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         Hook.js
// @namespace    https://github.com/invobzvr
// @version      0.1
// @description  Javascript function hook
// @author       invobzvr
// @homepageURL  https://github.com/invobzvr/invotoys.js/tree/main/hook.js
// @supportURL   https://github.com/invobzvr/invotoys.js/issues
// @license      GPL-3.0
// ==/UserScript==

(function () {
    const ORI = {};

    Function.prototype.hook = function (params) {
        typeof params === 'function' && (params = {
            scope: window,
            before: params,
        });
        !params.scope && (params.scope = window);
        const that = this,
            name = that.name;
        ORI[name] = that;
        params.scope[name] = function () {
            if (typeof params.before === 'function') {
                const ret = params.before.apply(this, arguments);
                if (ret !== undefined) {
                    return ret;
                }
            }
            let val = that.apply(this, arguments);
            if (typeof params.after === 'function') {
                const ret = params.after.apply(this, [val, arguments]);
                if (ret !== undefined) {
                    val = ret;
                }
            }
            return val;
        }
    }
})();