Ich mag es zu denken, dass ich JavaScript verstehe, aber ich fand etwas unerwartetes heute und ich hoffte, dass jemand mir erklären könnte, warum es passiert.Verwenden von 'dieses' Schlüsselwort in JavaScript-Objekt
Nehmen Sie diesen Code
var animalData = {
cow:"cow",
sheep:"sheep",
getCow:function()
{
return this.cow;
},
animalList:[
{
animalId:this.cow,
label:"This is a cow"
},
{
animalId:this.sheep,
label:"This is a sheep"
}
]
};
console.log(animalData.getCow());
console.log(JSON.stringify(animalData.animalList,null," "))
Der Ausgang ist nicht das, was ich erwartet hatte. Rufen Sie animalData.getCow()
Ergebnisse in "cow"
auf, wie Sie es erwarten würden. Aber es ist, was durch die zweite console.log
Rückkehr erhält, die mich verwirrt.
[
{
"label": "This is a cow"
},
{
"label": "This is a sheep"
}
]
Mit anderen Worten, entfernt das Objekt die animalId
Eigenschaft vollständig aus den definierten Objekten. Ich hatte erwartet, dieses
[
{
"animalId":"cow",
"label": "This is a cow"
},
{
"animalId":"sheep",
"label": "This is a sheep"
}
]
Und ich könnte vielleicht dieses
[
{
"animalId":undefined,
"label": "This is a cow"
},
{
"animalId":undefined,
"label": "This is a sheep"
}
]
verstehen Aber warum die animalId
Eigenschaft erhalten vollständig entfernt?
Kann jemand erklären, was unter der Oberfläche passiert, um dieses Verhalten zu verursachen? Ich vermute, dass das Schlüsselwort this
nicht funktioniert, weil die Eigenschaften nicht definiert sind, wenn es aufgerufen wird, aber warum wird die Eigenschaft vollständig entfernt?
NB: Ich suche keine Workaround, das ist einfach genug zu tun - nur daran interessiert, warum es passiert.
Auf eine zufällige Notiz. Warum verwenden Sie JSON stringify, um ein Objekt zu protokollieren? Verwenden Sie einfach console.log/console.dir, damit Sie das Objekt leicht untersuchen können. – evolutionxbox
@evolutionxbox Eine andere Möglichkeit, es zu betrachten, ist, dass er nur 'console.log' benutzt, um den Effekt des Stringings dieses Objekts zu sehen, nicht, dass er es stringt, um es zu loggen. –
@evolutionxbox Ein Grund wäre, dass, wenn Sie das Objekt direkt protokollieren, wenn Sie das Objekt in der Konsole erweitern, Sie die ** aktuellen ** Werte erhalten, nicht die Werte dieses Objekts, wenn es protokolliert wurde. Dies liegt daran, dass der Browser bei der einfachen Protokollierung des Objekts nur eine Referenz auf dieses Objekt speichert und keine tiefe Kopie des aktuellen Objekts. – Cristy