如何列出使用Object.defineProperty定义的属性

时间:2016-04-13 13:50:55

标签: javascript

是否可以列出使用Object.defineProperty定义的所有属性? 迭代对象时不会显示这些内容:

for (var prop in obj) { ... }

而且没有Object.getOwnPropertyNames。

更新:我想只有使用enumerable:true标志集创建它们才有可能。

1 个答案:

答案 0 :(得分:4)

Object.getOwnPropertyNames

返回的非可枚举属性

var obj = {};
Object.defineProperty(obj, "foo", {value:42});
document.body.innerHTML = Object.getOwnPropertyNames(obj).join(", ");

如果使用Symbol而不是字符串名称定义它们,则使用Object.getOwnPropertySymbols

如果您需要查找不可枚举的继承的属性,则必须通过Object.getPrototypeOf循环原型链。

这是一个查找所有字符串属性名称的示例,无论它们是否可枚举,包括继承的(注意我们在Object.prototype上看到非枚举;如果我们没有,我们可以提前停止'我想要他们):

var proto = {}
Object.defineProperty(proto, "answer", {value: 42});
var obj = Object.create(proto);
Object.defineProperty(obj, "question", {value: "Life, the Universe, and Everything"});

document.body.innerHTML = getAllPropertyNames(obj).join(", ");

function getAllPropertyNames(o) {
  var names = [];
  while (o) {     // We'd use `o != Object.prototype` to stop earlier
    names.push.apply(names, Object.getOwnPropertyNames(o));
    o = Object.getPrototypeOf(o);
  }
  return names;
}