Lubię myśleć, że rozumiem JavaScript, ale znalazłem dzisiaj coś nieoczekiwanego i miałem nadzieję, że ktoś może mi wyjaśnić, dlaczego tak się dzieje.Używanie słowa kluczowego "this" w obiekcie JavaScript
wziąć to kod
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," "))
Wyjście nie jest to, czego się spodziewałem. Wywołanie animalData.getCow()
wyników w "cow"
tak, jak można się spodziewać. Ale to, co dostaje powrót przez sekundę console.log
, co wprowadza mnie w błąd.
[
{
"label": "This is a cow"
},
{
"label": "This is a sheep"
}
]
Innymi słowy, przedmiotem własności animalId
usuwa całkowicie z obiektów określonych. Spodziewałem się tego
[
{
"animalId":"cow",
"label": "This is a cow"
},
{
"animalId":"sheep",
"label": "This is a sheep"
}
]
I mogę zrozumieć Może to
[
{
"animalId":undefined,
"label": "This is a cow"
},
{
"animalId":undefined,
"label": "This is a sheep"
}
]
Ale dlaczego nieruchomość animalId
zostaną usunięte całkowicie?
Czy ktoś może wyjaśnić, co dzieje się pod powierzchnią, aby spowodować takie zachowanie? Zgaduję, że słowo kluczowe this
nie działa, ponieważ właściwości są niezdefiniowane, gdy jest wywoływana, ale dlaczego całkowicie usuwa tę właściwość?
NB: Nie szukam obejścia, to dość proste - po prostu interesuje mnie, dlaczego tak się dzieje.
Na losowej notatce. Dlaczego używasz string string JSON do logowania obiektu? Po prostu użyj konsoli console.log/console.dir, aby w łatwy sposób zbadać obiekt. – evolutionxbox
@evolutionxbox Innym sposobem na sprawdzenie tego jest to, że po prostu używa on 'console.log', aby zobaczyć efekt wiązania tego obiektu, a nie to, że on je podpisuje. –
@evolutionxbox Jednym z powodów może być to, że jeśli zarejestrujesz obiekt bezpośrednio, po rozwinięciu obiektu w konsoli otrzymasz ** bieżące ** wartości, a nie wartości tego obiektu, gdy był on zalogowany. Dzieje się tak dlatego, że po prostu rejestrując obiekt, przeglądarka zapisuje jedynie odniesienie do tego obiektu, a nie do głębokiej kopii bieżącego obiektu. – Cristy