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