Object.keys()
ein Array eines bestimmten Objekts eigenen enumerable Eigenschaften zurückgibt (zählbare bedeutet nur, dass, wenn Sie versucht haben, durch das Objekt iterieren, nur jene Eigenschaften, deren enumerable Eigenschaft auf true
sind angeschaltet - siehe Object.getOwnPropertyDescriptor
).
bedeutet Dies könnte, dass die ip
Eigenschaft nicht vom request
Objekt und das Objekt request
die ip
Eigenschaft erbt auf der Prototypkette irgendwo gehört.
Um wirklich zu beweisen, dass dies der Fall ist, können Sie Object.getPrototypeOf()
Methode verwenden.
Zuerst versuchte ich einfach Object.getPrototypeOf(req)
, aber ich fand die Eigenschaft ip
auf das zurückgegebene Objekt nicht. Also grub ich weiter in die Prototyp-Kette.
console.log(Object.getPrototypeOf(Object.getPrototypeOf(req)));
dies ergab ein Objekt mit ip als Eigenschaft
IncomingMessage {
...
acceptsEncodings: [Function]
ip: [Getter],
ips: [Getter],
...
}
Wie bereits erwähnt, weil ip
Adresse Eigenschaft von der Prototypkette geerbt wird, Object.keys()
nicht ip
listet als Eigenschaft der req
Objekt.
Es hebt auch eine weitere nette Funktion in JS verfügbar: Getters, aka berechnete Eigenschaftswerte.
Manchmal ist es wünschenswert, den Zugriff auf eine Eigenschaft zu ermöglichen, die eine dynamisch berechneten Wert zurückgibt, oder Sie können, ohne dass die Verwendung von expliziten Methode den Status eine interne Variable reflektieren wollen nennt. Lesen Sie über Getters auf MDN.
Genau das passiert hier. Express verfügt über eine interne Logik zum Auswählen der IP-Adresse aus den Nutzdaten der HTTP-Anforderung und statt wie folgt auf die IP-Adresse zuzugreifen: req.ip()
, Express-Entwickler haben die Eigenschaft ip
an eine Funktion gebunden, die beim Zugriff auf die IP-Adresse aufgerufen wird ip
Eigenschaft und Sie können einfach über req.ip
auf die IP-Adresse zugreifen.
['Object.keys'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) gibt ein Array des Objekts zurück ** eigene Enumerable * * Eigenschaften. Wenn die IP-Adresse also irgendwo in der Prototypkette liegt (nicht ** im Besitz **) oder als ** nicht aufzählbar ** gekennzeichnet ist, wird sie nicht aufgelistet. –
.. das gleiche passiert mit Arrays: 'Object.keys (someArray);' wird nicht die 'Länge'-Eigenschaft enthalten. –
Es scheint, dass es als "enumerable: true" markiert ist und als eigene Eigenschaft festgelegt ist. –