Я хотел бы знать, есть ли способ отличить функцию 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
...