Czy istnieje sposób, aby jakakolwiek funkcja wyświetlała instrukcję console.log, gdy jest wywoływana, rejestrując gdzieś globalny punkt zaczepienia (to znaczy bez modyfikowania samej funkcji) lub w inny sposób?
97
Czy istnieje sposób, aby jakakolwiek funkcja wyświetlała instrukcję console.log, gdy jest wywoływana, rejestrując gdzieś globalny punkt zaczepienia (to znaczy bez modyfikowania samej funkcji) lub w inny sposób?
Odpowiedzi:
Oto sposób na rozszerzenie wszystkich funkcji w globalnej przestrzeni nazw o wybraną funkcję:
Jedną z wad jest to, że żadne funkcje utworzone po wywołaniu nie
augment
będą miały dodatkowego zachowania.źródło
fn.apply(this, arguments);
nareturn fn.apply(this, arguments);
return
do najbardziej wewnętrznej funkcji.Jak dla mnie wygląda to na najbardziej eleganckie rozwiązanie:
źródło
Metoda proxy do rejestrowania wywołań funkcji
Jest nowy sposób wykorzystania Proxy do osiągnięcia tej funkcjonalności w JS. załóżmy, że chcemy mieć a,
console.log
ilekroć wywoływana jest funkcja określonej klasy:możemy zastąpić naszą instancję klasy serwerem proxy, który przesłania każdą właściwość tej klasy. więc:
sprawdź, czy to faktycznie działa w Codepen
Pamiętaj, że używanie
Proxy
daje o wiele więcej funkcji niż samo rejestrowanie nazw konsoli.Również ta metoda działa w node.js też.
źródło
Jeśli chcesz bardziej ukierunkowane rejestrowanie, poniższy kod będzie rejestrował wywołania funkcji dla określonego obiektu. Możesz nawet modyfikować prototypy Object, aby wszystkie nowe instancje również były rejestrowane. Użyłem Object.getOwnPropertyNames zamiast for ... in, więc działa z klasami ECMAScript 6, które nie mają wyliczalnych metod.
źródło
Oto trochę JavaScript, który zastępuje dodanie console.log do każdej funkcji w Javascript; Graj z nim na Regex101 :
To „szybki i brudny hack”, ale uważam go za przydatny do debugowania. Jeśli masz dużo funkcji, uważaj, ponieważ doda to dużo kodu. Ponadto wyrażenie regularne jest proste i może nie działać w przypadku bardziej złożonych nazw / deklaracji funkcji.
źródło
W rzeczywistości możesz dołączyć własną funkcję do console.log dla wszystkiego, co się ładuje.
źródło