Morton 20 de agosto de 2014 a las 09.03
   Imprimir artículo
elWebmaster.com

Cómo detectar si una función es nativa con JavaScript


javascriptwide2Una parte importante a la hora de testear nuevas implementaciones es poder comprobar si la función dada fue provista por el navegador o por un proceso tercerizado que actúa como si fuera la implementación nativa. ¿Cómo podemos lograrlo?

Una buena manera de detectarlo es evaluar el valor que la función devuelve en toString. El código para conseguirlo es bastante sencillo:

  1. function isNative(fn) {
  2.  return (/\{\s*\[native code\]\s*\}/).test('' + fn);
  3.  }

Convertir la representación de string de la función y realizar una comparación de regex en el string es lo que hará el truco.

Esta es la manera simple, pero existe una más compleja, aunque más efectiva:

  1. (function() {
  2.  
  3. // Se usa para resolver la `[[Class]]` interna de los valores
  4. var toString = Object.prototype.toString;
  5.  
  6. // Se usa para resolver la fuente de funciones decompilada
  7. var fnToString = Function.prototype.toString;
  8.  
  9. // Se usa para detectar constructores de host (Safari > 4; really typed array specific)
  10. var reHostCtor = /^\[object .+?Constructor\]$/;
  11.  
  12. // Compila un regexp usando un método nativo simple como template.
  13. var reNative = RegExp('^' +
  14. String(toString)
  15. // Escapa cualquier caracter regexp
  16. .replace(/[.*+?^${}()|[\]\/\\]/g, '\\$&')
  17. // Reemplaza menciones de `toString` con `.*?` para mantener el template genérico
  18. .replace(/toString|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
  19. );
  20.  
  21. function isNative(value) {
  22. var type = typeof value;
  23. return type == 'function'
  24. // Usa `Function#toString`para hacer bypass del valor del método que haya elegido.
  25. ? reNative.test(fnToString.call(value))
  26. : (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;
  27. }
  28.  
  29.  // exporta lo que quieras
  30. module.exports = isNative;
  31. }());

Recuerda que no debes usar esto como un método de seguridad. sino como un indicio relacionado al soporte nativo.

Esperamos que te sea de utilidad ¡Hasta la próxima!

Fuente original del artículo: David Walsh Blog
Traducción realizada por
elWebmaster.com


Enviar a Del.icio.us Enviar a Meneame Enviar a Digg Enviar a Fresqui Enviar a Enchilame

Deja tu opinión

© 2007 - 2008 elWebmaster.com | Powered by Wordpress | Diseño CSS y XHTML válido. | Algunos íconos basados en FamFamFam Mini
Acceder