Erkennen, ob die Funktion native browser
Ich versuche zu iterieren über alle den globals definiert, in eine Webseite, aber damit bin ich auch immer die native browser-Funktionen.
var numf=0; var nump=0; var numo=0;
for(var p in this) {
if(typeof(this[p]) === "function"){
numf+=1;
console.log(p+"()");
} else if(typeof p != 'undefined'){
nump+=1;
console.log(p);
} else {
numo+=1;
console.log(p);
}
}
Gibt es eine Möglichkeit zu bestimmen, ob eine Funktion ist nativ auf dem browser oder in einem Skript?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie rufen Sie die geerbt
.toString()
Funktion, die auf den Methoden und überprüfen Sie das Ergebnis. Native Methoden wird ein block wie[native code]
.Update, da viele der Kommentatoren wollen einige Klarstellungen und die Leute haben wirklich eine Anforderung für eine solche Erkennung. Um diese Prüfung wirklich sparen, wir sollten wahrscheinlich verwenden Sie eine Zeile dieses:
Nun sind wir mit den
.toString
Methode aus derprototype
vonFunction
das macht es sehr unwahrscheinlich, wenn nicht unmöglich einigen anderen script überschriebentoString
Methode. Zweitens, wir sind der überprüfung mit einem regulären Ausdruck, so können wir nicht täuschen lassen durch Kommentare innerhalb der Funktion Körper.toString
funktioniert nicht in allen modernen Browsern oder so etwas.toString
überschrieben, Sie sollten in der Lage sein zu tunFunction.prototype.toString.call(obj).indexOf('[native code]');
Auch wäre es wahrscheinlich eine bessere Idee, mit RegExp. Versuchen Sie den Aufruf der Funktion gegen sich selbst, und es kommen würde, wie native, denn es erscheint in der Zeichenfolge.bind
binden Sie eine Methode, um bestimmten Kontext, die resultierende Methode ist zwar nicht heimisch, aber Ihre check würde sagen, seine Muttersprache.window.alert = function () {}; window.alert = window.alert.bind()
checkNative
mit jAndy-code, wird es wiedertrue
auf sich selbst.function () { /* [native code] */ console.log("I'm not native."); }
?diesem sollte gut genug sein. diese Funktion führt die folgenden tests durch:
function Empty(){}
)function <valid_function_name> (<valid_param_list>) { [native code] }
regex ist ein wenig kompliziert, aber eigentlich läuft ziemlich anständig schnell in chrome auf meinem 4GB lenovo laptop (core duo):
3023ms. also die Funktion übernimmt, irgendwo um 3 micro-sec zu laufen, wenn man alles JIT ' ed.
Es funktioniert in allen Browsern. Zuvor, ich benutzte Funktion.der Prototyp.toString.Anruf, dieses stürzt ab, DH, da im IE der DOM-element-Methoden und-Fenster Methoden sind NICHT Funktionen, sondern Objekte, und Sie haben keine toString-Methode. String-Konstruktor löst das problem elegant.
Function.prototype.toString
manipuliert werden können, etwas, das ein bisschen wie diese:Können Sie erkennen, ob
Function.prototype.toString
ist verwüstet durch überfüllung.apply()
,.call()
,.bind()
(und andere).Und wenn es war, können Sie sich eine "saubere" version von
Function.prototype.toString
von einem neu gespritztIFRAME
.Habe ich versucht einen anderen Ansatz. Dies ist nur getestet für firefox und chrome.
false
fürPromise
obwohl mein browser unterstützt das verspricht nativ.then
Methode, die wie native verspricht beheben Bibliothek verspricht keiner Weise. Wenn alle Stricke reißen, dann benutze ichPromise.resolve(nonNative)
zu normalisieren, alle verspricht.RegExp
.Object.prototype.toString.call(RegExp.prototype)
zurück [Objekt RegExp]. Ich weiß nicht, über IE oder Opera.let f = function() {}; f.prototype = Object.prototype; isNative(f) // true
.fast alle scheitern, weil:
JS:
statt:
JS: