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

为何Object.create(task)创建的newTask打印为空?原型继承疑问

为什么Object.create创建的对象打印时不显示原型上的属性?

先看你执行的这段代码:

var task = {};
task.prop1 = "prop1 value";
task.prop2 = "prop2 value";
console.log(task);
var newTask = Object.create(task);
console.log(newTask);

你疑惑的点很合理——明明newTask的原型是task,为什么打印出来是空对象?其实这是JS对象属性和原型链的一个基础特性,我给你拆解清楚:

核心原因:Object.create的作用是设置原型,不是复制属性

Object.create(task)做的事情,是把newTask的**内部原型([[Prototype]])**指向task,但并不会把task的属性复制成newTask的自有属性。也就是说:

  • task的prop1、prop2是它自己的自有属性
  • newTask本身没有任何自有属性,它的属性都是从原型链(也就是task)继承来的

控制台打印的规则:只显示自有属性

浏览器或Node.js的控制台在打印对象时,默认只会展示对象本身的自有属性,不会把原型链上的属性一起列出来。这就是为什么你看到newTask打印结果是{}。

验证方法

你可以用这几个方法来确认:

  1. 用Object.getOwnPropertyNames(newTask)查看自有属性:
    console.log(Object.getOwnPropertyNames(newTask)); // 输出 [],说明没有自有属性
    
  2. 直接访问继承的属性,能正常获取到值:
    console.log(newTask.prop1); // 输出 "prop1 value"
    
  3. 验证原型指向:
    console.log(Object.getPrototypeOf(newTask) === task); // 输出 true,证明原型确实是task
    

简单来说,newTask确实能用到task的属性,但这些属性不属于它自己,所以控制台默认不显示。如果想让控制台展示原型链内容,大部分浏览器的开发者工具里可以展开对象的[[Prototype]]选项(通常显示为__proto__),就能看到继承的属性了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:47:09