Javascript 访问对象';s的不可枚举属性

Javascript 访问对象';s的不可枚举属性,javascript,object,prototype,Javascript,Object,Prototype,下面这个问题:问谁 为什么console.log(Object.prototype)不记录预期的对象,而是返回{} 答案如下: 这是因为console.log[…]在对象上使用Object.keys(),并且仅返回可枚举属性。prototype包含不可枚举的属性,这就是它返回空节点的原因 - 我想知道如何输出给定对象的所有属性(例如object.prototype)。如另一个答案所示,使用getOwnPropertyNames很好: constObjectPrototype=Object.g

下面这个问题:问谁

为什么
console.log(Object.prototype)
不记录预期的对象,而是返回
{}

答案如下:

这是因为
console.log
[…]在对象上使用
Object.keys()
,并且仅返回可枚举属性。prototype包含不可枚举的属性,这就是它返回空节点的原因

-


我想知道如何输出给定对象的所有属性(例如
object.prototype
)。如另一个答案所示,使用
getOwnPropertyNames
很好:

constObjectPrototype=Object.getOwnPropertyNames(Object.prototype).reduce((对象,名称)=>{
object[name]=object.prototype[name];
返回对象;
}, {});
console.log(
对象原型
);

.as console wrapper{max height:100%!important;top:0;}
您可以编写一个函数,我们称之为
getAllPropertyNames()
,它迭代对象的原型链并累积每个级别的属性:

函数getAllPropertyNames(o){ 让propertyNames=[] for(让proto=o;proto!==null;proto=Object.getPrototypeOf(proto)){ propertyNames=propertyNames.concat(Object.getOwnPropertyNames(proto)) } 返回属性名称 }
log(getAllPropertyNames({mykey:'value'}))
您正在寻找的是一个foreach循环,请参阅此线程:至少在Chrome上,我的更新应该像开发人员控制台一样输出
对象
。您无法访问隐藏的属性,这就是它们被隐藏的原因。Chrome之所以显示它,是因为调试器比JS本身所能做的功能更强大,而且它以令人困惑的名称
\uuuuu proto\uuuu
显示它,这表明它是一个普通属性。(也就是说,您可以通过
对象.getPrototypeOf
访问原型,但通常不可能访问隐藏属性)。只需使用
对象。getPrototypeOf
而不是不推荐使用的
\uuuuuuuuuuuuuuuuuuuuuu
@Bergi
对象。getPrototypeOf
不允许将
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。因为我在那个例子中已经使用了
Object.defineProperty(…,“\uuu proto\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。而且它不是不推荐的
\uuuu proto\uuu
getter/setter,您仍然应该避免使用它。