Teoretycznie to w ogóle się tego nie da się tego zrobić, tj. nie da się zagwarantować pobrania ostatnio zdefiniowanej własności w obiekcie. W ECMAScripcie (JS to pochodna ECMAScriptu) obiekty to zbiory własności bez określonej kolejności (ang. unordered). Specyfikacja nie gwarantuje, że pętla for-in będzie iterowała się przez własności w kolejności ich zdefinowania w obiekcie.
W praktyce implementacje prawie zawsze tak właśnie robią. Wyjątki raczej nie powinny Cię tutaj ugryźć, choć zwróć uwagę na Operę i Chrome (w Chromie mieli to "naprawić" -- nie pamiętam, czy już naprawili).
Zwróć proszę uwagę, że taka pętla for-in, jaką masz, będzie też iterowała przez własności dodane do prototypu obiektu, po którym iterujesz. W tym przypadku prototypem jest Object.prototype
. Jeśli ktoś stworzy własność powiedzmy Object.prototype.foobar
, to ta pętla for-in przeiteruje się również po własności foobar
. Żeby uniknąć iterowania po własnościach prototypów i uwzględnić tylko "własne" własności obiektów, trzeba użyć hasOwnProperty, jak poniżej:
for (var j in tablica) {
if (tablica.hasOwnProperty(j)) {
i = j;
}
}
Wracając do tego, co chcesz zrobić. W nowszych wersjach JavaScriptu dostępna jest funkcja Object.keys(ob)
zwracającą nazwy wszystkich własności własnych (przepraszam za masło maślane) obiektu ob
, które byłyby uwzględnione przez pętlę for-in (więcej info: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys). Object.keys
zwraca tablicę, więc mógłbyś łatwo odnieść się do ostatniej własności tej tablicy.
Tyle że Object.keys
to raczej przyszłość niż teraźniejszość i obecnie ciężko z kompatybilnością, praktycznie nie da się tego używać.
Pozostaje chyba napisać własną funkcję korzystającą z for-in, albo użyć jakiejś funkcji napisanej już przez kogoś innego (np. biblioteka Prototype udostępnia taką metodę).