Я всегда сталкиваюсь с ситуациями, когда мне нужно проверить, является ли функция собственным кодом-это очень важный контент в функциональном тестировании: является ли функция, поддерживаемая браузером, встроенным или моделируемой через сторонние библиотеки классов. Чтобы обнаружить это, самый простой способ - это, конечно, - судить о значении, возвращаемой методом ToString функции.
Код JavaScript
На самом деле довольно просто определить, является ли функция нативной:
// Определите, является ли нативная функция insnative (fn) {// Пример: // alert.toString () // "function alert () {[Native Code]}" // ' + fn использует неявное преобразование типа JS. return (// {/s*/[Native Code/]/s*/}/). test ('' + fn); }Преобразовать функцию в строковое представление и выполнить регулярное сопоставление, это принцип реализации.
Обновленная версия, обновление!
; (function () {// Получить метод toString объекта, используемый для обработки внутреннего (внутреннего) значения, передаваемого в параметре `[[class]]` var toString = object.prototype.toString; // Получить метод примитивного функции, используемый для обработки кода декомпиляции var fntoString = functions var -ostructoring. (Конструкторы хоста), // (Safari> 4; действительно специфичный для вывода массива) var rehostctor =/^/[Object. +? Constructor/] $/; String (ToString) // Удовлетворение всех специальных символов, связанных с регулярными выражениями. параметров метода. .Replace (/toString | (function).*? (? = /// () | for. +? (? = ///])/g, '$ 1.*?') // endword + '$'); Функция isnative (значение) {// Судья тип типа var type = typeof value; return type == 'function' // Используйте нативный метод `function#toString ? renative.test (fntoString.call (value)) // Если тип не является «функцией», // вам необходимо проверить объект хоста (объект хоста), // Потому что некоторые (браузер) среды будут рассматривать типированные массивы как методы DOM // Стандартный нативный регулярный шаблон не могут быть сопоставлены: (Value && type == 'Object' && rehostctor.test (toString). ЛОЖЬ; }; // Вы можете присвоить ISNATION желаемому объекту/объекту window.isnative = ISnative; } ());Тестовый код:
Isnative (Isnative) // False Isnative (Alert) // true window.isnative (window.isnative) // false window.isnative (window.alert) // true window.isnative (string.toString) // true