2016-11-13 39 views
0

我知道對象文字可以通過使用Object.keys()方法列出其對象。但是通過構造函數創建的對象呢?Javascript - 列出來自對象的所有屬性/方法

function Foo() {} 
Foo.prototype.bar = 'bar'; 
Foo.prototype.baz = 'baz'; 

var foo = new Foo(); 
console.log(Object.keys(foo).join(', ')); // returns '' 
console.log(Object.getOwnPropertyNames(foo).join(', ')); // returns '' 
+4

理解的關鍵是單詞'Own'在'getOwnPropertyNames' – trincot

回答

2

Object.keys只會得到自己枚舉的屬性,並getOwnPropertyNames只會得到自己性能(即使不枚舉)。它們都不會給你從原型(或其原型,或,...)繼承的屬性名稱。

如果您只關心enumerable屬性,see trincot's answer

如果你想他們的所有,¹即使他們不枚舉,您必須通過原型鏈環:

function getAllPropertyNames(obj) { 
 
    var result = []; 
 
    while (obj && obj !== Object.prototype) { 
 
    result.push.apply(result, Object.getOwnPropertyNames(obj)); 
 
    obj = Object.getPrototypeOf(obj); 
 
    } 
 
    return result; 
 
} 
 

 
function Foo() {} 
 
Foo.prototype.bar = 'bar'; 
 
Foo.prototype.baz = 'baz'; 
 

 
var foo = new Foo(); 
 
console.log(getAllPropertyNames(foo));

在這個例子中,我停了下來當我們達到Object.prototype,但當然你可以繼續下去,直到你點擊null代替:

function getAllPropertyNames(obj) { 
 
    var result = []; 
 
    while (obj) { 
 
    result.push.apply(result, Object.getOwnPropertyNames(obj)); 
 
    obj = Object.getPrototypeOf(obj); 
 
    } 
 
    return result; 
 
} 
 

 
function Foo() {} 
 
Foo.prototype.bar = 'bar'; 
 
Foo.prototype.baz = 'baz'; 
 

 
var foo = new Foo(); 
 
console.log(getAllPropertyNames(foo));


¹「如果你想他們的所有 ...」注意,在上面的,我們並沒有試圖獲得由Symbols,而不是字符串命名屬性。如果我們這樣做了,我們會使用getOwnPropertySymbols以及getOwnPropertyNames

2

您可以使用for循環:

function Foo() {} 
 

 
Foo.prototype.bar = 'bar'; 
 
Foo.prototype.baz = 'baz'; 
 

 
var foo = new Foo(); 
 

 
for (var key in foo) 
 
    console.log(key, foo[key]);

注意,這有一定的侷限性。一些屬性可以被設置爲不可枚舉的,然後不會被包含。這是例如用於陣列的length財產的情況:

var a = [1, 2]; 
 

 
for (var key in a) 
 
    console.log(key, a[key]);

相關問題