Есть ли способ перебрать встроенные свойства объекта Javascript?
for ... in приближает меня к тому месту, куда я хочу пойти, но «цикл for ... in не выполняет итерацию по встроенным свойствам».



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это будет работать с JSON. Не много тестировалось:
<style>
.tree {
margin-left:5px;
}
</style>
<div id='out'></div>
<script type = "text/javascript">
data = {"feep":{"bar":{"baz":"37628","quux":{"a":"179","b":"7"}},"foo":"1025"},"Bleh":"1234"}
$('out').innerHTML = renderJSON(data)
function renderJSON(obj) {
var keys = []
var retValue = ""
for (var key in obj) {
//$('out').innerHTML = $('out').innerHTML +"<br />" + key + ", " + obj[key]
if (typeof obj[key] == 'object') {
retValue += "<div class='tree'>" + key
retValue += renderJSON(obj[key])
retValue += "</div>"
}
else {
retValue += "<div class='tree'>" + key + " = " + obj[key] + "</div>"
}
keys.push(key)
}
return retValue
}
</script>
Когда вы говорите «встроенные свойства», о каком именно наборе свойств вы имеете в виду?
Из "JavaScript - хорошие стороны" Дугласа Крокфорда:
The for in statement can loop over all of the property names in an object. The enumeration will include all of the properties—including functions and prototype properties that you might not be interested in—so it is necessary to filter out the values you don't want. The most common filters are the hasOwnProperty method and using typeof to exclude functions:
var name; for (name in another_stooge) { if (typeof another_stooge[name] !== 'function') { document.writeln(name + ': ' + another_stooge[name]); } }
Мой конкретный вариант использования - это перечисление встроенных методов для Array.prototype. Из справки по javascript ядра MDC: «Цикл for ... in не выполняет итерацию по встроенным свойствам». Что подтверждает простой цикл над Array.prototype.
Ответ - нет. Невозможно перечислить свойства, которые нельзя перечислить. Однако есть как минимум два способа обойти это.
Первый - создать все возможные комбинации символов для использования в качестве имен тестовых свойств (подумайте: a, b, c, ... aa, ab, ac, ad, ...). Учитывая, что сообщество стандартов известно тем, что придумывает действительно длинные имена методов (getElementsByTagNames, propertyIsEnumerable), этот метод потребует некоторого терпения. :-)
Другой подход - проверить известные собственные свойства из некоторого предопределенного списка.
Например: для array вы должны проверить все известные собственные свойства Function.prototype:
prototype caller constructor length name apply call toSource toString valueOf toLocaleString
... и вещи, унаследованные от Object.prototype:
__defineGetter__ __defineSetter__ hasOwnProperty isPrototypeOf __lookupGetter__
__lookupSetter__ __noSuchMethod__ propertyIsEnumerable unwatch watch
... и вещи, унаследованные от Array:
index input pop push reverse shift sort splice unshift concat join slice indexOf lastIndexOf
filter forEach every map some reduce reduceRight
..и, наконец, при желании, каждое перечислимое свойство объекта, который вы тестируете:
for (var property in myArrayObject) myPossibleProperties.push( property );
Затем вы сможете протестировать каждый из них, чтобы увидеть, присутствуют ли они в экземпляре объекта.
Это не покажет неизвестных неперечислимых членов (недокументированных или установленных другими скриптами), но позволит вам перечислить, какие собственные свойства доступны.
Я нашел информацию о собственных свойствах Array на Центр разработчиков Mozilla и MSDN.
Нет, вы не можете перечислить встроенные свойства объекта. Но вы можете обратиться к справочнику разработчика. Например, чтобы узнать все методы и свойства объекта Math, реализованного в firefox, вы воспользуетесь справочником Firefox по Javascript Math: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math.
Я понимаю, что этому вопросу три года, но теперь, с ES5, это возможно:
>>> Object.getOwnPropertyNames(Object)
["prototype", "getPrototypeOf", "getOwnPropertyDescriptor", "keys", "defineProperty", "defineProperties", "create", "getOwnPropertyNames", "isExtensible", "preventExtensions", "freeze", "isFrozen", "seal", "isSealed", "length", "arity", "name", "arguments", "caller"]
Чтобы немного уточнить, Object.getOwnPropertyNames (Array) предоставляет встроенные свойства для Array.
Не могли бы вы преобразовать свой объект в JSON и проанализировать результат?