You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么Node.js控制台不显示含自有属性的非空对象内容?

为什么Chrome和Node.js控制台打印Object.create创建的对象输出不同?

先看你的示例代码:

const wolf = {
    type: 'canine',
}

const pug = Object.create(wolf, {
    size: { value: 's' }
});

console.log(pug.hasOwnProperty('size')); // true

Chrome控制台输出:{size: 's'},而Node.js 19.0.0控制台输出:{},差异的核心原因在于属性可枚举性和控制台的打印逻辑差异:

1. size属性默认是不可枚举的

使用Object.create()的第二个参数定义属性时,每个属性描述符的默认配置是:

  • writable: false
  • enumerable: false
  • configurable: false

也就是说,你定义的size确实是pug的自身属性(所以hasOwnProperty返回true),但它是不可枚举的。可以通过以下代码验证:

console.log(Object.getOwnPropertyDescriptors(pug));
// 输出:{ size: { value: 's', writable: false, enumerable: false, configurable: false } }

2. 控制台打印逻辑不同

  • Chrome DevTools:控制台在展示对象时,会列出对象自身的所有属性,无论属性是否可枚举,因此能看到size。
  • Node.js:console.log()内部依赖util.inspect()来格式化输出,而util.inspect()默认只显示对象的可枚举自身属性。由于size不可枚举,所以打印结果为{}。

验证与统一输出的方法

如果想让Node.js控制台也显示size,只需在定义属性时显式设置enumerable: true:

const pug = Object.create(wolf, {
    size: { 
        value: 's',
        enumerable: true
    }
});

此时Chrome和Node.js的控制台都会输出{size: 's'}。

另外,在Node.js中若要查看对象的所有自身属性(包括不可枚举的),可以使用Object.getOwnPropertyNames():

console.log(Object.getOwnPropertyNames(pug)); // 输出:['size']

内容的提问来源于stack exchange,提问作者devope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:45:28