簡體   English   中英

Javascript-列出對象的所有屬性/方法

[英]Javascript - List all properties/methods from an object

我知道可以使用Object.keys()方法列出對象文字的鍵。 但是通過構造函數創建的對象呢?

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 ''

Object.keys將僅擁有自己的可枚舉屬性,而getOwnPropertyNames將僅擁有自己的屬性(即使不可枚舉)。 他們都不會給你從原型繼承屬性的名稱(或它的原型,或者它的 ...)。

如果您只關心可枚舉的屬性, 請參見trincot的答案

如果您想全部使用它們,¹即使它們不是無法枚舉的,也必須遍歷原型鏈:

 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時,我停了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

您可以使用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]); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM