为何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打印结果是{}。
验证方法
你可以用这几个方法来确认:
- 用
Object.getOwnPropertyNames(newTask)查看自有属性:console.log(Object.getOwnPropertyNames(newTask)); // 输出 [],说明没有自有属性 - 直接访问继承的属性,能正常获取到值:
console.log(newTask.prop1); // 输出 "prop1 value" - 验证原型指向:
console.log(Object.getPrototypeOf(newTask) === task); // 输出 true,证明原型确实是task
简单来说,newTask确实能用到task的属性,但这些属性不属于它自己,所以控制台默认不显示。如果想让控制台展示原型链内容,大部分浏览器的开发者工具里可以展开对象的[[Prototype]]选项(通常显示为__proto__),就能看到继承的属性了。
内容的提问来源于stack exchange,提问作者suhas tangadle
相关产品推荐
相关产品推荐

