迭代一个对象的属性

4
有没有一种方法可以迭代对象的属性和方法?我需要编写一个类似于以下的实用函数:
function iterate(obj)
{
    //print all obj properties     
    //print all obj methods
}

所以运行这个函数:

iterate(String);

将会打印:

property: lenght
function: charAt
function: concat...

有什么想法吗?
4个回答

13

应该很简单:

function iterate(obj) {
    for (p in obj) {
        console.log(typeof(obj[p]), p);
    }
}

注意: console.log 函数默认你正在使用 Firebug。在这一点上,以下内容:

obj = {
    p1: 1, 
    p2: "two",
    m1: function() {}
};

iterate(obj);

将会返回:

number p1
string p2
function m1

看起来运行你的例子是可以的。 但是当我使用String类时,它没有返回任何东西。iterate(String);我还尝试过: var s =“sss”; iterate(s); - Amir
当您迭代字符串时,它将逐个字符地进行。尝试传递String(s)来将字符串包装在对象中。 - devios1

6

请查看我在这个问题中的回答,但是您不能像那样读取内置属性。


3

这仅适用于现代浏览器(Chrome,Firefox 4+,IE9+),但在ECMAScript 5中,您可以使用Object.getOwnPropertyNames获取对象的所有属性。只需要一点额外的代码即可从原型中获取继承的属性。

// Put all the properties of an object (including inherited properties) into
// an object so they can be iterated over
function getProperties(obj, properties) {
    properties = properties || {};

    // Get the prototype's properties
    var prototype = Object.getPrototypeOf(obj);
    if (prototype !== null) {
        getProperties(prototype, properties);
    }

    // Get obj's own properties
    var names = Object.getOwnPropertyNames(obj);
    for (var i = 0; i < names.length; i++) {
        var name = names[i];
        properties[name] = obj[name];
    }

    return properties;
}

function iterate(obj) {
    obj = Object(obj);

    var properties = getProperties(obj);

    for (var name in properties) {
        if (typeof properties[name] !== "function") {
            console.log("property: " + name);
        }
    }
    for (var name in properties) {
        if (typeof properties[name] === "function") {
            console.log("function: " + name);
        }
    }
}

0

您可以使用for循环来迭代对象的属性。

这里是一个简单的例子

var o ={'test':'test', 'blah':'blah'};

for(var p in o)
    alert(p);

如果属性是一个对象的键怎么办? - Buffalo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接