2016-11-13 48 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]);