Ich schreibe eine Funktion, die true
zurückgibt, wenn das übergebene Argument eine Instanz von JavaScript Map ist.Ermitteln, ob ein Objekt eine Map in JavaScript ist
Wie Sie vielleicht erraten haben typeof new Map()
gibt die Zeichenfolge object
zurück und wir erhalten keine handliche Map.isMap
Methode.
Hier ist, was ich bisher:
function isMap(v) {
return typeof Map !== 'undefined' &&
// gaurd for maps that were created in another window context
Map.prototype.toString.call(v) === '[object Map]' ||
// gaurd against toString being overridden
v instanceof Map;
}
(function test() {
const map = new Map();
write(isMap(map));
Map.prototype.toString = function myToString() {
return 'something else';
};
write(isMap(map));
}());
function write(value) {
document.write(`${value}<br />`);
}
So weit so gut, aber wenn Karten zwischen dem Rahmen zu testen und wenn toString()
außer Kraft gesetzt wurde, isMap
fehlschlägt (I do understand why).
Beispiel:
<iframe id="testFrame"></iframe>
<script>
const testWindow = document.querySelector('#testFrame').contentWindow;
// false when toString is overridden
write(isMap(new testWindow.Map()));
</script>
Here is a full Code Pen Demonstrating the issue
Gibt es eine Möglichkeit, die isMap
Funktion zu schreiben, so dass es true
zurückkehren wird, wenn beide toString
außer Kraft gesetzt wird, und das Kartenobjekt stammt aus einem anderen Rahmen?
@Bergi, wie ist das ein Duplikat? Ihre Antwort befürwortet die Verwendung von "instanceof" meine Frage besagt, dass das Problem, das ich mit "instanceof" habe, auch die interne Methode, die Sie am Set überprüfen, gilt nicht für den 'Map'-Prototyp (glaube ich). – robbmj
Es ist genau das gleiche für Sätze und Karten. Ich denke, ich werde die Antwort besser kanonisch bearbeiten. – Bergi
@Bergi bitte siehe oben Bearbeiten, zu meinem Kommentar. – robbmj