2008-11-04 3 views
6

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

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

+0

Не могли бы вы stringify свой объект JSON и проанализировать результат? – starbeamrainbowlabs 2012-08-28 13:10:03

ответ

-1

Это будет работать с 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> 
0

Когда вы говорите, «встроенный в свойстве», которые устанавливают свойства вы точно говорите?

От Douglas Крокфорда-х 'JavaScript - The Good Parts':

для в заявлении может перебирает все из имен свойств в объекте. Перечисления будет включать в себя все свойство, включая функции и свойств прототипа, которые вы можете не быть заинтересованы в том, так необходимо отфильтровать значения, которые вы не хотите. Наиболее распространенные фильтры не метод hasOwnProperty и с помощью TypeOf исключить функции:

var name; 
for (name in another_stooge) 
{ 
    if (typeof another_stooge[name] !== 'function') { 
     document.writeln(name + ': ' + another_stooge[name]); 
    } 
} 
+0

В моем конкретном примере использования перечислены встроенные методы для Array.prototype. Из справки jQuery ядра MDC: «В цикле« ... для ... не перебирает встроенные свойства ». Какой простой цикл над Array.prototype подтверждает. – 2008-11-04 19:08:29

5

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

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

-1

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

17

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

>>> Object.getOwnPropertyNames(Object)

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

+3

Чтобы немного уточнить, Object.getOwnPropertyNames (Array) предоставляет встроенные свойства для Array. – forforf 2012-05-25 22:35:05