js的原型链之create

发布于:2025-06-19 ⋅ 阅读:(20) ⋅ 点赞:(0)

引言

var homework = {
    topic: "JS",
};
var otherHomework = Object.create(homework);
otherHomework.topic; // "JS"

疑问: 为什么我不直接用homework.topic而是用Object.create(homework)创建之后再调用

什么是 Object.create()?

Object.create(proto) 创建一个新对象 ,这个新对象的原型(prototype)指向 proto 对象 。

所以这行代码:

javascript
var otherHomework = Object.create(homework);

意思是:创建一个叫 otherHomework 的新对象,它的原型是 homework。

✅ 然后:访问属性时发生了什么?

当访问 otherHomework.topic 的时候,JavaScript 引擎会做这样的查找:

  • 先看 otherHomework 自己有没有 topic 属性。
  • 如果没有,就去它的原型(也就是 homework)上找。
  • 如果原型上也没有,继续往原型链上找,直到找到 null 为止。

例子中:

  • otherHomework 自己没有 topic 属性。
  • 它的原型是 homework,而 homework topic: "JS"
  • 所以 otherHomework.topic 就“继承”了原型上的值 “JS”`。

✅ 那么:otherHomework.topic 和 homework.topic 有什么区别?

在这里插入图片描述

代码说明

console.log(homework.topic);         // "JS" ← 自己有的
console.log(otherHomework.topic);    // "JS" ← 原型上的

// 给 otherHomework 添加自己的 topic
otherHomework.topic = "CSS";

console.log(homework.topic);         // "JS" ← 不受影响
console.log(otherHomework.topic);    // "CSS" ← 自己的属性覆盖了原型上的

// 删除自己的属性后,又回到原型的值
delete otherHomework.topic;
console.log(otherHomework.topic);    // "JS" ← 又从原型读取

otherHomework.topic 是通过原型链 访问到的属性,而 homework.topic 是对象自身的属性。它们虽然当前值一样,但来源不同,行为也不同。


网站公告

今日签到

点亮在社区的每一天
去签到