2016-10-10 1 views
5

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?

+0

@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

+0

Es ist genau das gleiche für Sätze und Karten. Ich denke, ich werde die Antwort besser kanonisch bearbeiten. – Bergi

+0

@Bergi bitte siehe oben Bearbeiten, zu meinem Kommentar. – robbmj

Antwort

2

Sie können Object.prototype.toString.call(new testWindow.Map) überprüfen.

Wenn dies außer Kraft gesetzt wurde, haben Sie wahrscheinlich kein Glück.

+0

Interessant, hatte ich nicht davon. Ich denke, es fügt einen zusätzlichen Schritt der Sicherheit hinzu. – robbmj

+0

Ich würde mir keine Sorgen machen, dass 'toString' überschrieben wird (Sie können es zwischenspeichern, wenn Sie zuerst kommen), sondern eher über' Symbol.toStringTag'. – Bergi

Verwandte Themen