删除Object.create生成对象的name属性后为何输出Jon而非undefined?
现象原因分析
你运行的代码如下:
const person = { isHuman: false, name:"Jon", printIntroduction: function() { console.log(this.name); } }; const me = Object.create(person); me.name = 'Matthew'; me.isHuman = true; delete me.name me.printIntroduction();
输出为Jon而非undefined,核心是JavaScript的原型链属性查找规则:
- 通过
Object.create(person)创建的me对象,会将person作为自己的原型对象(内部[[Prototype]]属性指向person) delete me.name只会删除me对象自身持有的name属性,不会修改它的原型对象上的任何属性- 当访问对象的某个属性时,JavaScript会优先查找对象自身的属性列表,如果找不到,就会顺着原型链向上逐层查找原型对象的属性,直到原型链顶端都找不到才会返回
undefined。你删除me自身的name后,访问this.name时就会沿着原型链找到person上的name:"Jon",因此输出Jon。 - 补充说明:这里
printIntroduction调用时this指向me,属性查找完全遵循me的原型链规则,逻辑是自洽的。
相关知识点优质学习资料
- 《JavaScript高级程序设计(第4版)》第6章、第8章:对对象结构、原型、原型链、继承的相关概念讲解系统全面,覆盖从入门到进阶的所有常用场景,适合所有阶段的开发者参考。
- 《你不知道的JavaScript(上卷)》第二部分:对
this指向规则、原型链的底层运行逻辑、Object.create的实现原理都有非常深入的拆解,适合想要吃透JavaScript核心机制的开发者学习。 - 国内正规高校计算机专业开设的前端开发课程中JavaScript面向对象编程模块:对原型相关基础概念的讲解通俗易懂,适合零基础入门学习。
内容的提问来源于stack exchange,提问作者user14219692
相关产品推荐
相关产品推荐

