列出对象'的内置属性

List Object's built-in Properties

本文关键字:内置 属性 对象      更新时间:2023-09-26

有没有一种方法可以让我在Javascript对象的内置属性上循环?

对于。。。in让我接近我想去的地方,但"for…in循环不会迭代内置属性。"

我意识到这个问题已经存在三年了,但现在,有了ES5,它是可能的:

>>> Object.getOwnPropertyNames(Object)

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

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

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

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

例如:对于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 );

然后,您将能够测试其中的每一个,看看它们是否存在于对象实例中。

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

我在Mozilla开发者中心和MSDN上找到了有关本机Array属性的信息。

当你说"内置属性"时,你到底在说哪组属性?

来自Douglas Crockford的"JavaScript-好的部分":

for in语句可以循环所有对象中属性名称的。枚举将包括属性,包括函数和原型属性对…不感兴趣过滤掉您的值所必需的不要。最常见的过滤器hasOwnProperty方法和使用typeof排除函数:

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

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

不,您不能列出对象的内置属性。但是您可以参考实现者的参考资料。例如,要了解在firefox上实现的Math对象的所有方法和属性,您将使用firefox的Javascript Math Reference:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Math