Я хотел бы знать, есть ли способ отличить функцию JavaScript script (function(){}) от встроенной функции JavaScript (например, Math.cos).
Я уже знаю трюк func.toString().indexOf('[native code]') != -1, но мне было интересно, есть ли другой способ его обнаружить.
Контекст:
Мне нужно создать No-op forwarding ES6 Proxy, который может обрабатывать собственные функции для объекта, но с ошибкой TypeError: Illegal invocation (см. Ошибка незаконного вызова с использованием ES6 Proxy и node.js).
Чтобы обойти это я .bind() все мои функции в обработчике get моего прокси-сервера, но если бы я мог эффективно обнаруживать собственную функцию, мне нужно будет только .bind() выполнять эти собственные функции.
подробнее: https://github.com/FranckFreiburger/module-invalidate/blob/master/index.js#L106
Примечание:
(function() {}).toString() -> "function () {}"
(function() {}).prototype -> {}
(require('os').cpus).toString() -> "function getCPUs() { [native code] }"
(require('os').cpus).prototype -> getCPUs {}
(Math.cos).toString() -> "function cos() { [native code] }"
(Math.cos).prototype -> undefined
(Promise.resolve().then).toString() -> "function then() { [native code] }"
(Promise.resolve().then).prototype -> undefined
изменить
На данный момент лучшим решением является проверка !('prototype' in fun), но он не будет работать с require('os').cpus...