我知道对象文字可以使用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 ''
答案 0 :(得分:2)
Object.keys
只会获得自己的可枚举属性,getOwnPropertyNames
只会获得拥有属性(即使不可枚举)。它们都不会为您提供从原型(或其原型或其,......)继承的属性的名称。
如果您只关心可枚举的属性,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));
¹“如果你想要所有 ......”请注意,在上面的内容中,我们没有尝试获取由{{3命名的属性而不是字符串。如果我们这样做,我们会使用getOwnPropertySymbols
以及getOwnPropertyNames
。
答案 1 :(得分: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]);