2009-07-31 141 views
3

有沒有辦法迭代對象的屬性和方法。我需要寫一個實用功能,像這樣:迭代對象的屬性

function iterate(obj) 
{ 
    //print all obj properties  
    //print all obj methods 
} 

所以運行此功能:

iterate(String); 

會打印:

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

什麼想法?

回答

12

應該是如此簡單:

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 
+0

似乎運行您的示例工作。 但是當我使用String類時,它沒有返回任何東西。 iterate(String);我也試過: var s =「sss」; iterate(s); – Amir 2009-07-31 21:53:24

+0

當你迭代一個字符串時,它會遍歷每個字符。嘗試傳遞String(s),而不是將字符串包裝在一個對象中。 – devios1 2011-06-24 14:52:14

0

可以使用for循環迭代對象的屬性。

下面是一個簡單的例子

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

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

如果財產是一個對象的關鍵? – Buffalo 2017-06-23 15:51:47

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); 
     } 
    } 
}