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

删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:09:03