2017-12-29 7 views
0

So gibt es in der V8-Konsole Ich spiele und ich habeWarum ist Länge eine Eigenschaft von `Array` nicht` Array.prototype` Kette

Object.getOwnPropertyNames([]) 

Ich erwartete [] als Ergebnis zu bekommen, aber ["length"]

SO bedeutet dies, dass anstelle Teil der Prototypkette des Seins, length Mitglied Eigenschaft aller Array Objekte.

Ist das ein Bug, oder gibt es eine Design oder bestimmten Grund length ist nicht der Teil einer Prototypkette?

+0

auch signifikant, 'length' ist keine Funktion, die die Länge berechnet, sondern eine Eigenschaft, die die Länge speichert. Wenn es das erste wäre, hätte es auf dem Prototyp definiert werden können. –

+0

Mögliche Duplikat [Array.length vs Array.prototype.length] (https://stackoverflow.com/questions/28240173/array-length-vs-array-prototype-length) – LW001

+0

Siehe auch https://stackoverflow.com/questions/22658488/object-getownpropertynames-vs-object-keys – dfsq

Antwort

1

Das ist kein Fehler. Per Definition gibt Object.getOwnPropertyNames alle aufzählbaren und nicht aufzählbaren eigenen Eigenschaften eines Objekts zurück. Wenn es sich um ein Array handelt, ist length eine eigene Eigenschaft, aber die aufzählbare Eigenschaft ist false. Aus diesem Grund wird es in das Ergebnis aufgenommen.

können Sie es mit dem folgenden Code-Schnipsel testen,

console.log(Object.getOwnPropertyDescriptors([])); 

Der obige Code wird die Deskriptoren aller eigenen Eigenschaften zurückzukehren. Inspizieren Sie es, Sie werden von seiner aufzählbaren Eigenschaft erfahren.

0

Prototype Eigenschaften werden über Objekte gemeinsam genutzt. Wenn die Länge also auf den Prototyp gesetzt wird, haben alle Array-Objekte die gleiche Länge, was falsch ist. Länge gibt die Anzahl der Elemente im aktuellen Array an und sollte Eigentum von self bleiben.

+0

Also Prototyp-Ketten, im Wesentlichen sind Singleton? –

Verwandte Themen