Javascript - 列出对象的所有属性/方法

时间:2016-11-13 15:29:10

标签: javascript constructor

我知道对象文字可以使用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 ''

2 个答案:

答案 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]);