В моей разработке я часто сталкиваюсь с ситуациями, когда мне нужно определить, является ли функция нативной функцией JavaScript. Иногда это очень необходимая задача. Вы должны знать, предоставляется ли эта функция самим браузером или инкапсулируется и замаскируется как нативная функция третьей стороной. Конечно, лучший способ - изучить возвратное значение метода ToString, который выполняет эту функцию.
JavaScript
Способ выполнения этой задачи очень прост:
Кода -копия выглядит следующим образом:
функция isnative (fn) {
return (// {/s*/[Native Code/]/s*/}/). test ('' + fn);
}
Метод ToString вернет форму строки этого метода, а затем использует регулярное выражение, чтобы определить символы, содержащиеся в нем.
Более сильный метод
Джон-Дэвид Далтон, основатель Lodash, нашел лучшее решение:
Кода -копия выглядит следующим образом:
; (function () {
// используется для разрешения внутренней `[[class]]` значений
var toString = object.prototype.toString;
// используется для разрешения декомпилированного источника функций
var fntoString = function.prototype.toString;
// используется для обнаружения конструкторов хоста (Safari> 4; действительно напечатано специфичное массив)
var rehostctor =/^/[Object.+? Constructor/] $/;
// Скомпилируйте регуляцию с использованием общего нативного метода в качестве шаблона.
// Мы выбираем `Object#ToString`, потому что есть большая вероятность, что он не будет защелкнут.
var renative = regexp ('^' +
// принуждение `Object#toString` к строке
Строка (toString)
// избежать любых специальных символов режима
.replace (/[.*+?^$ {} () | [/] /////]/g, '// $ &')
// заменить упоминания о «toString» с `.*?` Для поддержания шаблона общего.
// заменить такую вещь, как `для ...` для поддержки таких средств, как Rhino, которые добавляют дополнительную информацию
// такие как метод Arity.
.Replace (/toString | (function).*? (? = /// () | for. +? (? = ///])/g, '$ 1.*?') + '$'
);
функция isnative (значение) {
var type = typeof value;
return type == 'function'
// Использование `function#toString` для обойти собственное значение значения` toString
// и избегайте фальсификации.
? renative.test (fntoString.call (значение))
// Перезагрузка на проверку объекта хоста, потому что некоторые среды будут представлять собой
// такие вещи, как напечатанные массивы в качестве методов DOM, которые могут не соответствовать
// нормальный нативный шаблон.
: (value && type == 'Object' && rehostctor.test (toString.call (value))) || ЛОЖЬ;
}
// Экспорт, как вы хотите
module.exports = isnative;
} ());
Теперь вы это тоже видите, это очень сложно, но более мощно. Конечно, это не для защиты безопасности, это просто предоставляет вам соответствующую информацию о том, является ли она собственной функцией.