Список встроенных свойств объекта - PullRequest
6 голосов
/ 04 ноября 2008

Есть ли способ для меня перебрать встроенные свойства Javascript объекта?

for ... in приближает меня к тому, куда я хочу пойти, но "цикл for ... in не выполняет итерации по встроенным свойствам."

Ответы [ 5 ]

17 голосов
/ 01 августа 2011

Я понимаю, что этому вопросу уже три года, но теперь, с ES5, это возможно:

>>> Object.getOwnPropertyNames(Object)

["prototype", "getPrototypeOf", "getOwnPropertyDescriptor", "keys", "defineProperty", "defineProperties", "create", "getOwnPropertyNames", "isExtensible", "preventExtensions", "freeze", "isFrozen", "seal", "isSealed", "length", "arity", "name", "arguments", "caller"]

5 голосов
/ 06 ноября 2008

Ответ - нет. Вы не можете перечислить свойства, которые не перечисляются. Однако есть как минимум два пути решения этой проблемы.

Первый - создать все возможные комбинации символов для использования в качестве имен тестовых свойств (например: 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 Developer Center и MSDN .

0 голосов
/ 12 августа 2010

Нет, вы не можете перечислить встроенные свойства объекта. Но вы можете сослаться на ссылку исполнителя. Например, чтобы узнать все методы и свойства объекта Math, реализованные в Firefox, вы будете использовать Javascript Math Reference, разработанный Firefox:

0 голосов
/ 04 ноября 2008

Когда вы говорите «встроенные свойства», о каком наборе свойств вы говорите?

Из «1003 *» JavaScript Дугласа Крокфорда «Хорошие части» :

Оператор for in может зацикливаться на всех имен свойств в объекте. Перечисление будет включать все свойства, включая функции и свойства прототипа, которые вы могли бы не интересоваться - так оно и есть необходимо отфильтровать значения, которые вы не хочу Самые распространенные фильтры являются методом hasOwnProperty и использование typeof для исключения функций:

var name; 
for (name in another_stooge) 
{
    if (typeof another_stooge[name] !== 'function') {
        document.writeln(name + ': ' + another_stooge[name]);
    } 
}
0 голосов
/ 04 ноября 2008

Это будет работать с 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...