Javascript 列出对象';s内置属性

Javascript 列出对象';s内置属性,javascript,reflection,properties,Javascript,Reflection,Properties,有没有一种方法可以让我遍历Javascript对象的内置属性 for…in让我接近我想要去的地方,但是“for…in循环不会迭代内置属性。”这将适用于JSON。它没有经过太多的测试: <style> .tree { margin-left:5px; } </style> <div id='out'></div> <script type="text/javascript"> data = {"feep":{"bar":{"baz

有没有一种方法可以让我遍历Javascript对象的内置属性


for…in让我接近我想要去的地方,但是“for…in循环不会迭代内置属性。”

这将适用于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>

.树{
左边距:5px;
}
数据={“feep”:{“bar”:{“baz”:“37628”,“qux”:{“a”:“179”,“b”:“7”},“foo”:“1025”},“Bleh”:“1234”}
$('out').innerHTML=renderJSON(数据)
功能渲染器(obj){
变量键=[]
var retValue=“”
for(obj中的var键){
//$('out').innerHTML=$('out').innerHTML+“
“+key+”,“+obj[key] 如果(对象的类型[键]=“对象”){ retValue+=“”+键 retValue+=renderJSON(对象[键]) retValue+=“” } 否则{ retValue+=''+key+''=''+obj[key]+'' } 按键。按(键) } 返回值 }
当你说“内置属性”时,你到底指的是哪一组属性

来自道格拉斯·克罗克福德的:

for in语句可以循环到所有 对象中的属性名称。 枚举将包括所有 属性包括函数和 您可能需要的原型属性 不感兴趣是这样的 需要筛选出您需要的值 我不想要。最常见的过滤器 是hasOwnProperty方法和 使用typeof排除函数:

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

答案是否定的。您不能枚举不可枚举的属性。然而,至少有两种方法可以解决这个问题

第一个是生成所有可能的字符组合以用作测试属性名(想想:a、b、c、…aa、ab、ac、ad、…)。鉴于标准社区以提出非常长的方法名(getElementsByTagNames、PropertyEnumerable)而闻名,这种方法需要一些耐心。:-)

另一种方法是从一些预定义的列表中测试已知的本机属性

例如:对于
数组
,您将测试
函数的所有已知本机属性。原型

prototype caller constructor length name apply call toSource toString valueOf toLocaleString
__defineGetter__ __defineSetter__ hasOwnProperty isPrototypeOf __lookupGetter__
__lookupSetter__ __noSuchMethod__ propertyIsEnumerable unwatch watch
…以及从对象继承的内容。原型:

prototype caller constructor length name apply call toSource toString valueOf toLocaleString
__defineGetter__ __defineSetter__ hasOwnProperty isPrototypeOf __lookupGetter__
__lookupSetter__ __noSuchMethod__ propertyIsEnumerable unwatch watch
…以及从
数组继承的内容:

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 );
然后,您将能够测试其中的每一个,以查看它们是否存在于对象实例中

这不会显示未知的不可枚举成员(未记录或由其他脚本设置),但允许您列出可用的本机属性


我在和上找到了有关本机
数组
属性的信息。

否您不能列出对象的内置属性。 但是您可以参考实现者的参考。
例如,要了解在firefox上实现的Math对象的所有方法和属性,您可以使用firefox的Javascript数学参考:

我意识到这个问题已经三年了,但是现在,使用ES5,可以:

对象。getOwnPropertyNames(对象)


[“prototype”、“getPrototypeOf”、“getOwnPropertyDescriptor”、“keys”、“defineProperty”、“defineProperties”、“create”、“getOwnPropertyNames”、“isExtensible”、“preventExtensions”、“freeze”、“IsFreeze”、“seal”、“isSealed”、“length”、“arity”、“name”、“arguments”、“caller”]

我的特定用例是枚举Array.prototype的内置方法。来自MDC核心javascript参考:“for…in循环不会在内置属性上迭代。”Array.prototype上的简单循环证实了这一点。为了澄清一点,Object.getOwnPropertyNames(数组)提供了数组的内置属性。能否将对象字符串化为JSON并解析结果?