Siempre encuentro situaciones en las que necesito verificar si una función es un código nativo: este es un contenido muy importante en las pruebas funcionales: ¿la función es compatible con el navegador incorporado o simulada a través de bibliotecas de clase de terceros? Para detectar esto, la forma más fácil es, por supuesto, juzgar el valor devuelto por el método de tostración de la función.
Código JavaScript
En realidad, es bastante simple determinar si una función es nativa:
// Determinar si la función de la función nativa esnative (fn) {// ejemplo: // alert.tostring () // "función alerta () {[código nativo]}" // '' + fn utiliza la conversión de tipo implícita de JS. return (// {/s*/[código nativo/]/s*/}/). test ('' + fn); }Convierta la función en una representación de cadena y realice una coincidencia regular, este es el principio de implementación.
Versión actualizada, actualización!
; (function () {// Obtener el método de objeto ToString, utilizado para procesar el interno (interno) del valor aprobado en el parámetro `[[class]]` var toString = object.prototype.ToString; // Obtener el método de toString de la función primitiva, se usa para manejar el código de descomposición de las funciones var fnToString = function (Constructores de host), // (Safari> 4; realmente emitir una matriz específica) VAR rehostctor =/^/[Object. +? Constructor/] $/; String (toString) // Escape todos los caracteres especiales relacionados con expresiones regulares. de parámetros del método. .replace (/toString | (function).*? (? = /// () | for. +? (? = ///])/g, '$ 1.*?') // Endword + '$'); función isnative (valor) {// juzgar tipo de typeof var type = typeof value; Tipo de retorno == 'function' // Use el método nativo `function#toString` para llamar, // en lugar de valorar su propio método 'toString`, // para evitar ser engañado por la falsificación. ? Renative.test (fntostring.call (valor)) // Si el tipo no es 'función', // necesita verificar el objeto host (objeto host), // porque algunos entornos (navegador) tratarán las matrices tipificadas como métodos dom // en este momento, el patrón regular estándar no puede ser coincidente: (value && tipo == 'object' && rehostctor.test (tostring.call (value))) FALSO; }; // puede asignar isnative a la variable/objeto que desea ventana.isnative = isnative; } ());Código de prueba:
isnative (isnative) // false isnative (alerta) // verdadero ventana.isnative (window.isnative) // false window.isnative (window.alert) // true window.isnative (string.ToString) // true