引言
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 是对象自身的属性。它们虽然当前值一样,但来源不同,行为也不同。