Bei meiner Entwicklungsarbeit stoße ich häufig auf Situationen, in denen ich feststellen muss, ob es sich bei einer Funktion um eine native JavaScript-Funktion handelt. Manchmal ist dies eine sehr notwendige Aufgabe. Sie müssen wissen, ob die Funktion vom Browser selbst bereitgestellt wird Drittanbieter-Kapselung und Tarnung als native Funktionen. Am besten ist es natürlich, den Rückgabewert der toString-Methode zu untersuchen, die diese Funktion ausführt.
Das JavaScript
Der Weg, diese Aufgabe zu erledigen, ist sehr einfach:
Eine leistungsfähigere Methode
Lodash-Gründer John-David Dalton hat eine bessere Lösung gefunden:
// Wird verwendet, um die interne „[[Klasse]]“ von Werten aufzulösen
var toString = Object.prototype.toString;
// Wird verwendet, um die dekompilierte Funktionsquelle aufzulösen
var fnToString = Function.prototype.toString;
// Wird zum Erkennen von Hostkonstruktoren verwendet (Safari > 4; wirklich typisiertes Array spezifisch)
var reHostCtor = /^[object ?Constructor]$/;
// Kompilieren Sie einen regulären Ausdruck mit einer gängigen nativen Methode als Vorlage.
// Wir haben „Object#toString“ gewählt, weil die Wahrscheinlichkeit groß ist, dass es nicht verfälscht wird.
var reNative = RegExp('^'
// „Object#toString“ in einen String umwandeln
String(toString)
// Alle speziellen regulären Ausdruckszeichen maskieren
.replace(/[.* ?^${}()|[]/\]/g, '\$&')
// Erwähnungen von „toString“ durch „.*?“ ersetzen, um die Vorlage generisch zu halten.
// Ersetzen Sie Dinge wie „für ...“, um Umgebungen wie Rhino zu unterstützen, die zusätzliche Informationen hinzufügen
// wie method arity.
.replace(/toString|(function).*?(?=\()| for . ?(?=\])/g, '$1.*?') '$'
);
Funktion isNative(value) {
var type = typeof value;
Rückgabetyp == 'function'
// „Function#toString“ verwenden, um die eigene „toString“-Methode des Werts zu umgehen
// und vermeiden Sie es, gefälscht zu werden.
? reNative.test(fnToString.call(value))
// Fallback auf eine Host-Objektprüfung, da einige Umgebungen
darstellen
// Dinge wie typisierte Arrays als DOM-Methoden, die möglicherweise nicht dem
entsprechen
// normales natives Muster.
: (value && type == 'object' && reHostCtor.test(toString.call(value))) || false;
}
// exportieren, wie du willst
module.exports = isNative;
}());