是否可以列出使用Object.defineProperty定义的所有属性? 迭代对象时不会显示这些内容:
for (var prop in obj) { ... }
而且没有Object.getOwnPropertyNames。
更新:我想只有使用enumerable:true标志集创建它们才有可能。
答案 0 :(得分:4)
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;
}