Можно думать о статических методах и нестатических методах класса, как являющегося различными интерфейсами. Когда названо, статические методы разрешают к одиночному элементу статический объект класса, и нестатические методы решают к экземпляру класса, с которым Вы имеете дело. Так, при использовании статических и нестатических методов в интерфейсе Вы эффективно объявили бы два интерфейса, когда действительно мы хотим, чтобы интерфейсы использовались для доступа к одной связной вещи.
Alternatively, you could make a function, that gives you defaults:
function valueOrDefault(val, def) {
if (def == undefined) def = "";
return val == undefined ? def : val;
}
And then use it like this:
var place = response.Placemark[0];
var state = valueOrDefault(place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName);
var city = valueOrDefault(place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName);
Personally, I think it's a little nicer to write, than p00ya's proposal, although it's a little hacky fiddling around in undefined objects ... one could maybe change it to this:
function drill(p, a) {
a = a.split(".");//add this
for (i in a) {
var key = a[i];
if (p[key] == null)
return '';
p = p[key];
}
return p;
}
var obj = {foo:{bar:{baz:"quux"}}};
var s = drill(obj, "foo.bar.baz"));//and you can use a simple property chain
Вы можете использовать функцию, которая "детализирует" все эти уровни вложенности, по умолчанию выбирая пустую строку, если она не может продвинуться так далеко.
function drill(p, a) {
for (i in a) {
var key = a[i];
if (p[key] == null)
return '';
p = p[key];
}
return p;
}
var obj = {foo:{bar:{baz:"quux"}}};
var s = drill(obj, ["foo", "bar", "baz"]));
Вы смотрите только на первый результат, который дает вам геокодер:
var place = response.Placemark[0];
getLocations () возвращает список из нескольких результатов. Если у первого его нет, то почти наверняка будет один из следующих результатов.