Je rencontre toujours des situations où je dois vérifier si une fonction est du code natif - il s'agit d'un contenu très important dans les tests fonctionnels: la fonction est-elle prise en charge par le navigateur intégré ou simulé via des bibliothèques de classe tierces. Pour détecter cela, le moyen le plus simple est bien sûr de juger de la valeur renvoyée par la méthode de tostring de la fonction.
Code javascript
Il est en fait assez simple de déterminer si une fonction est native:
// Déterminez si la fonction de fonction native estnative (fn) {// Exemple: // alert.toString () // "fonction alert () {[code natif]}" // '' + fn utilise la conversion de type implicite de js. return (// {/ s * / [code natif /] / s * /} /). test ('' + fn); }Convertissez la fonction en représentation de chaîne et effectuez une correspondance régulière, c'est le principe de l'implémentation.
Version mise à niveau, mise à jour!
(function () {// Obtenez la méthode d'objet ToString, utilisée pour traiter l'interne (interne) de la valeur transmise dans le paramètre `[[classe]]` var toString = object.prototype.tostring; // Obtenez la méthode toString de la fonction primitive, utilisée pour gérer le code de décompilation; (constructeurs hôtes), // (Safari> 4; Sortie de la table spécifique spécifique) Var Rehostctor = / ^ / [objet. +? Constructeur /] $ /; String (toString) // échappe à tous les caractères spéciaux liés aux expressions régulières. Paramètres de la méthode. .replace (/ toString | (fonction). *? (? = /// () | for. +? (? = ///]) / g, '$ 1 *?') // endord + '$'); fonction isNative (valeur) {// juge type de typeof var type = typeof value; return type == 'function' // Utilisez la méthode native `function # toString` pour appeler, // au lieu de valeur votre propre méthode` toString`, // pour éviter d'être trompé par contrefaçon. ? Renative.test (fntoString.call (valeur)) // Si le type n'est pas 'fonction', // Vous devez vérifier l'objet hôte (objet hôte), // Parce que certains environnements (navigateur) traiteront les tableaux typés comme des méthodes DOM // à l'heure actuelle, le modèle régulier natif standard peut ne pas être apparié: (Value && type == 'Object' && rehostctor.test (toString.call (value) || FAUX; }; // Vous pouvez attribuer ISNATIVE à la variable / objet que vous souhaitez fenêtre.isnative = isNative; } ());Code de test:
isNative (isNative) // false isNative (alert) // true window.isnative (window.isnative) // false window.isnative (window.alert) // true window.isnative (string.tostring) // true