Advertisement
Guest User

Untitled

a guest
May 24th, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.59 KB | None | 0 0
  1. ;(function() {
  2.  
  3. // Используется для получения внутреннего `[[Class]]` значений
  4. var toString = Object.prototype.toString;
  5.  
  6. // Используется для получения декомпилированного кода функций
  7. var fnToString = Function.prototype.toString;
  8.  
  9. // Используется для определения родительских конструкторов (Safari > 4; специфично для типизированных массивов)
  10. var reHostCtor = /^\[object .+?Constructor\]$/;
  11.  
  12. // Создадим регулярное выражение используя в качестве шаблона общедоступный нативный метод.
  13. // Мы выбрали `Object#toString` потому что его, скорее всего, не изменяли.
  14. var reNative = RegExp('^' +
  15. // Принудительно переводим `Object#toString` в строку
  16. String(toString)
  17. // Экранируем все специальные символы регулярного выражения
  18. .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&')
  19. // Заменяем все упоминания `toString` на `.*?` для поддержания обобщённого вида.
  20. // Заменяем конструкции типа `for ...`, что бы поддерживать окружения
  21. // вроде Rhino, который добавляет дополнительную информацию (например, арность).
  22. .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
  23. );
  24.  
  25. function isNative(value) {
  26. var type = typeof value;
  27. return type == 'function'
  28. // Используем `Function#toString` что бы обойти собственный
  29. // метод `toString` value и не дать нас обмануть.
  30. ? reNative.test(fnToString.call(value))
  31. // Проверяем родительский объект, так как некоторые окружения представляют
  32. // штуки вроде типизированных массивов в виде DOM методов, что может
  33. // не соответствовать нормальному нативному шаблону
  34. : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;
  35. }
  36.  
  37. // Экспортируете то, что сочтёте нужным
  38. module.exports = isNative;
  39. }());
  40.  
  41. // Пример использования
  42. isNative(alert); // true
  43. isNative(myCustomFunction); // false
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement