Das Hinzufügen einer Funktion zu Array.prototype in IE führt dazu, dass sie in jedes Array als Element eingefügt wird

8

Ich habe das folgende Polyfill am Anfang meines Projekts zu Array hinzugefügt:

%Vor%

Das funktioniert in Chrome und Firefox einwandfrei, aber in Internet Explorer 11 wird diese Funktion tatsächlich in jedem Array als -Schub gedrückt, und ich kann sogar darauf zugreifen:

%Vor%

Dies wirft alle Arten von Ausnahmen im IE mit Funktionen wie .forEach , wo ich einige Daten erwarte und diese Funktion gefunden wird.

Hier ist ein Screenshot von den IE-Entwicklertools, in diesem Fall sollte dieses Array nur zwei Elemente anstelle von drei Elementen enthalten.

Und so sollte es sein, von Chrome. Tatsächlich glaube ich, dass sogar der tatsächliche Inhalt falsch ist, aber ich bin noch nicht dort angekommen (es sollte ein Array sein, das Arrays der Länge 2 enthält).

Wie kann sich JavaScript in IE11 immer noch so falsch verhalten, und wie kann ich diese Funktion korrekt zu prototype hinzufügen anstatt in jeder Array -Instanz?

    
Bruno Finger 01.02.2016, 16:12
quelle

1 Antwort

16

Es wird nicht in jedes Array "geschoben"; Sie haben dem Prototypobjekt eine Eigenschaft hinzugefügt, sodass es in jeder Arrayinstanz sichtbar und aufzählbar ist. So sollen prototypische Eigenschaften funktionieren.

Es funktioniert in Chrome und Firefox, weil .find() auf dem Prototyp in diesen Umgebungen so definiert ist, dass es sichtbar ist, aber nicht aufzählbar . Sie können dies in IE tun, indem Sie Object.defineProperty() :

verwenden %Vor%

Zusätzlich zur Eigenschaft "value", die eindeutig der Wert der neuen Eigenschaft ist, werden die Eigenschaften "enumerable" und "configurable" standardmäßig auf false gesetzt. Das bedeutet, dass "find" in keiner Situation angezeigt wird, in der die Objekteigenschaften durchlaufen werden.

    
Pointy 01.02.2016, 16:16
quelle