Ich begegne immer Situationen, in denen ich prüfen muss, ob eine Funktion nationaler Code ist. Dies ist ein sehr wichtiger Inhalt bei Funktionstests: Wird die Funktion, die durch den integrierten oder simulierten Browser-integrierten oder simulierten Klassenbibliotheken unterstützt wird. Um dies zu erkennen, ist es natürlich am einfachsten, den Wert der TOString -Methode der Funktion zu beurteilen.
JavaScript -Code
Es ist eigentlich ganz einfach festzustellen, ob eine Funktion nativ ist:
// Bestimmen Sie, ob die native Funktionsfunktion (fn) {// Beispiel: // alert.toString () // "Funktion alert () {[nativer Code]}" // '' + fn verwendet die implizite Typumwandlung von JS verwendet. return (// {/s*/[nativer Code/]/s*/}/). test ('' + fn); }Konvertieren Sie die Funktion in eine String -Darstellung und führen Sie eine regelmäßige Übereinstimmung durch. Dies ist das Prinzip der Implementierung.
Aktualisierte Version, Update!
; (function () {// Erhalten Sie die ToString -Methode des Objekts, die zur Verarbeitung des internen (internen) des Werts verwendet wird, der in Parameter `[[Klasse]]` var toString = Object.Prototypen.ToString; // die tostrosting -Methode abrufen kann. (Hostkonstruktoren), // (Safari> 4; wirklich spezifische Arrayspezifikation) var rehostctor =/^/[Objekt. +? Konstruktor/] $/; String (toString) // Entkommen Sie allen Sonderzeichen, die sich auf reguläre Ausdrücke beziehen (/[.*+?^$ {} () | [/] ////]/g, // $ & ') // Die Universalität der Vorlage aufrechterhalten, ersetzen Sie "Tasting". Parameter der Methode. .Replace (/toString | (Funktion).*? (? = /// () | für. +? (? function isnative (value) {// Richtertyp von Typ von var type = typeof value; Rückgabetyp == 'Funktion' // Verwenden Sie die native Methode "Funktion#toString" zum Aufrufen // anstelle von Ihrer eigenen "toString" -Methode //, um zu vermeiden, dass durch Fälschung getäuscht wird. ? renative.test (fntoString.call (value)) // Wenn Typ nicht 'Funktion' ist, müssen Sie das Host -Objekt (Host -Objekt) überprüfen, //, da einige (Browser) typisierte Arrays als Dom -Methoden behandelt werden. FALSCH; }; // Sie können dem Fenster von Variablen/dem gewünschten Objekt isnativ = isnativ zuweisen. } ());Testcode:
isnative (isnative) // false isnative (alarm) // True Window.isnative (window.isnativ) // Falsches Fenster.isnativ (window.alert) // True Window.isnative (String.ToString) // True