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
。
理解的關鍵是單詞'Own'在'getOwnPropertyNames' – trincot