En mi trabajo de desarrollo, a menudo encuentro situaciones en las que necesito determinar si una función es una función nativa de JavaScript. A veces esta es una tarea muy necesaria. Debe saber si esta función es proporcionada por el navegador en sí, o un tercero está encapsulado y disfrazado como una función nativa. Por supuesto, la mejor manera es examinar el valor de retorno del método ToString que ejecuta esta función.
El javascript
La forma de lograr esta tarea es muy simple:
La copia del código es la siguiente:
función esnative (fn) {
return (// {/s*/[código nativo/]/s*/}/). test ('' + fn);
}
El método ToString devolverá la forma de cadena de este método y luego usará una expresión regular para determinar los caracteres contenidos en él.
Un método más fuerte
John-David Dalton, el fundador de Lodash, encontró una mejor solución:
La copia del código es la siguiente:
;(función() {
// utilizado para resolver el `[[class]]` de valores interno
var toString = object.prototype.ToString;
// utilizado para resolver la fuente de funciones descompilada
var fNtostring = function.prototype.ToString;
// se usa para detectar constructores host (safari> 4; una matriz realmente escrita específica)
var rehostctor =/^/[objeto.+? constructor/] $/;
// compilar un regexp utilizando un método nativo común como plantilla.
// Elegimos `Object#ToString` porque hay una buena posibilidad de que no se esté acurrucado.
var renativo = regexp ('^' +
// coaccionar `objeto#toString` a una cadena
Cadena (toString)
// escapar de cualquier personaje especial de regexp
.replace (/[.*+?^$ {} () | [/] ////]/g, '// $ &')
// reemplazar las menciones de `toString` con`.*? `Para mantener la plantilla genérica.
// reemplazar cosas como `para ...` para admitir entornos como Rhino que agregan información adicional
// como la aridad del método.
.replace (/toString | (function).*? (? = /// () | for. +? (? = ///])/g, '$ 1.*?') + '$'
);
función esnative (valor) {
Var type = typeOf Value;
Tipo de retorno == 'Función'
// use `function#toString` para evitar el método 'toString' del valor del valor
// y evite ser falsificado.
? Renative.test (fntostring.call (valor))
// retroceso a una verificación del objeto de host porque algunos entornos representarán
// cosas como matrices tipificadas como métodos DOM que pueden no ajustarse al
// Patrón nativo normal.
: (valor && type == 'objeto' && rehostctor.test (toString.call (valor))) || FALSO;
}
// Exportar como quieras
módulo.exports = isnative;
} ());
Ahora también lo ves, es muy complejo, pero más poderoso. Por supuesto, esto no es para protección de seguridad, solo le proporciona información relevante sobre si se trata de una función nativa.