【问题标题】:Object.prototype returns empty object in NodeObject.prototype 在 Node 中返回空对象
【发布时间】:2018-12-16 10:40:49
【问题描述】:

当我在浏览器控制台中执行Object.prototype 时,我得到了Object.prototype 中可用的所有属性和方法。这是预期的,但是当我在 NodeJS 终端中执行完全相同的事情时,我得到一个空对象{}。谁能解释一下为什么会这样?我附上了两者的截图。

【问题讨论】:

  • 这纯粹是两种不同系统选择显示对象的方式。
  • @lonesomeday 那么{"key": "value"} 将显示为{"key": "value"},而不是{}。你确定吗?
  • @Ivan 是的。不同之处在于 Node 不显示不可枚举的属性,而 Chrome 控制台显示它们是淡出的。

标签: javascript node.js object


【解决方案1】:

这是因为 node 中的 console.log() 使用了 util.inspect(),它在对象上使用了 Object.keys(),它只返回可枚举的属性。而Object.prototype 包含不可枚举的属性,这就是它返回空节点的原因。

在下面的 sn-p 中可以观察到类似的行为,当我们 console.log(Object.prototype) 它记录一个空的 {};

console.log(Object.prototype);

但是当我们在Object.prototype 中明确定义一个可枚举属性时,它会记录一个包含该属性的对象:

Object.defineProperty(Object.prototype, 'property1', {
  value: 42,
  enumerable : true
});
console.log(Object.prototype)

对于Reference

【讨论】:

  • 我要补充一点,对于检查器(调试器、控制台等)应该如何显示内容没有达成一致的标准,因此不同的环境选择的实现略有不同。
  • 为什么Object.prototype的props默认不可枚举?
【解决方案2】:

顺便说一句,如果您想了解或访问这些属性,可以使用Object.getOwnPropertyNames

> Object.getOwnPropertyNames(Object.prototype)
[ 'hasOwnProperty',
  'constructor',
  'toString',
  'toLocaleString',
  'valueOf',
  'isPrototypeOf',
  'propertyIsEnumerable',
  '__defineGetter__',
  '__lookupGetter__',
  '__defineSetter__',
  '__lookupSetter__',
  '__proto__' ]

它不会列出您可能在 chrome 开发控制台中找到的其他属性,例如范围或承诺的值。不过已经够好了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 2015-02-11
    • 2020-12-21
    相关资源
    最近更新 更多