In meiner Entwicklungsarbeit begegne ich oft Situationen, in denen ich feststellen muss, ob eine Funktion eine native JavaScript -Funktion ist. Manchmal ist dies eine sehr notwendige Aufgabe. Sie müssen wissen, ob diese Funktion vom Browser selbst bereitgestellt wird oder von Dritten als native Funktion eingekapselt und verkleidet wird. Natürlich besteht der beste Weg darin, den Rückgabwert der Tastring -Methode zu untersuchen, die diese Funktion ausführt.
Das JavaScript
Die Art und Weise, diese Aufgabe zu erfüllen, ist sehr einfach:
Die Codekopie lautet wie folgt:
Funktion ist nativ (fn) {
return (// {/s*/[nativer Code/]/s*/}/). test ('' + fn);
}
Die ToString -Methode gibt die String -Form dieser Methode zurück und verwendet dann einen regulären Ausdruck, um die darin enthaltenen Zeichen zu bestimmen.
Eine stärkere Methode
John-David Dalton, der Gründer von Lodash, fand eine bessere Lösung:
Die Codekopie lautet wie folgt:
; (function () {
// Wird verwendet, um die internen `[[Klasse]]` von Werten zu beheben
var toString = Object.Prototype.toString;
// Wird verwendet, um die dekompilierte Funktionsquelle zu beheben
var fntoString = function.prototype.toString;
// verwendet zum Erkennen von Hostkonstruktoren (Safari> 4; wirklich typisierte Arrayspezifische)
var rehostctor =/^/[Objekt.+? Konstruktor/] $/;
// Kompilieren Sie einen Regexp mit einer gemeinsamen nativen Methode als Vorlage.
// Wir wählen "Objekt#toString", weil es eine gute Chance gibt, dass es nicht untergebracht wird.
var renative = regexp ('^' +
// `Object#toString` zu einer Zeichenfolge zwingen
String (ToString)
// entkommen alle speziellen Regexp -Zeichen
.Replace (/[.*+?^$ {} () | [/] ///]/g, '// $ &')
// Ersetzen Sie die Erwähnungen von "tostring" durch `.*?`, Um die Vorlage allgemein zu halten.
// Ersetzen Sie die Sache wie "für ...", um Umgebungen wie Rhino zu unterstützen, die zusätzliche Informationen hinzufügen
// wie Methode Arity.
.Replace (/toString | (Funktion).*? (? = /// () | für. +? (? = //])/g, '$ 1.*?') + '$' '
);
Funktion ist nativ (Wert) {
var type = typeof Wert;
Rückgabetyp == 'Funktion' '
// Verwenden Sie `function#toString`, um die eigene" toString` -Methode des Wertes "zu umgehen
// und vermeiden Sie es, ausgetäuscht zu werden.
? renative.test (fntoString.call (Wert))
// Fallback zu einer Überprüfung des Host -Objekts, da einige Umgebungen darstellen
// Dinge wie typisierte Arrays als DOM -Methoden, die möglicherweise nicht dem entsprechen
// normales natives Muster.
: (value && type == 'Object' && reehostctor.test (toString.call (value))) || FALSCH;
}
// Exportieren Sie, wie Sie wollen
module.exports = isnative;
} ());
Jetzt siehst du es auch, es ist sehr komplex, aber mächtiger. Dies dient natürlich nicht zum Sicherheitsschutz, sondern auch relevante Informationen darüber, ob es sich um eine native Funktion handelt.