【发布时间】:2018-12-18 10:28:53
【问题描述】:
下面这个问题:Object.prototype returns empty object in Node问了
为什么
console.log(Object.prototype)不记录预期的对象,而是返回{}。
答案如下:
这是因为
console.log[...] 在对象上使用了Object.keys(),并且它只返回可枚举的属性。而Object.prototype包含不可枚举的属性,这就是它返回空节点的原因。
我想知道如何输出给定对象的所有属性(例如Object.prototype)。如另一个答案所示,使用getOwnPropertyNames 工作正常:
const ObjectPrototype = Object.getOwnPropertyNames(Object.prototype).reduce((object, name) => {
object[name] = Object.prototype[name];
return object;
}, {});
console.log(
ObjectPrototype
);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我认为我可以通过这种方式提取给定对象的 隐藏 属性。但实际上,它并没有完全起作用。
这是一个更简单的示例:我正在检查的对象是对象{mykey: 'value'}。 Chrome 给了我它的属性(console.log 也给了我)还有它的原型,__proto__ 变灰了:
let object = { mykey: 'value' };
object = Object.getOwnPropertyNames(object).reduce((acc, name) => {
acc[name] = object[name];
return acc;
}, {});
console.log(
object
);
.as-console-wrapper { max-height: 100% !important; top: 0; }
上面只返回一个属性。我期待也有__proto__。 有没有办法显示一个人的所有属性,包括 隐藏 属性?还是我必须手动访问它:即减少Object.getOwnPropertyNames(object.__proto__)?
PS:或者换句话说,Chrome是如何处理隐藏属性的?
【问题讨论】:
-
您正在寻找的是一个 foreach 循环,请参阅此线程:stackoverflow.com/questions/7440001/…
-
至少在 Chrome 上,我的更新应该输出
object几乎和开发者控制台一样。 -
您无法访问隐藏的属性,这就是它们被隐藏的原因。 Chrome 显示它是因为调试器比 JS 单独可以做的更强大,并且它以令人困惑的名称
__proto__显示它,表明它是一个普通属性。 (也就是说,您可以通过Object.getPrototypeOf访问原型,但一般无法访问隐藏属性。
标签: javascript object prototype