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

关于Object.create()与对象字面量的使用差异疑惑

Object.create() 和对象直接赋值的本质区别

你代码里的两种写法看似结果相似,但底层逻辑完全不同,核心差异可以从这几个角度拆解:

1. 是不是同一个对象

  • 执行 let eagle = bird 时,eagle 只是 bird 的引用副本——它们指向内存里的同一个对象。你改 eagle.canFly = false,本质是直接修改了这个共享对象的属性,此时 bird.canFly 也会变成 false,不信你加一行 console.log(bird.canFly) 试试,结果肯定是 false。
  • 而 Object.create(bird) 会生成一个全新的空对象,这个新对象的内部原型([[Prototype]])会指向 bird。penguin 是独立的个体,给它加属性或者改属性,只会影响它自己,完全碰不到 bird 的属性。比如你打印 bird.canFly,结果还是初始的 true。

2. 属性读写的逻辑不一样

  • 对 eagle 来说,所有属性操作都是直接作用于原对象,不存在"找原型"的过程——因为它本身就是原对象的引用。
  • 对 penguin 来说,访问属性时会先查自己有没有,没有才会顺着原型链去 bird 里找。当你给 penguin.canFly 赋值 false,其实是给 penguin 自身新增了这个属性,之后再访问就会优先用自己的这个值,但原型对象 bird 里的 canFly 压根没变化。

3. 适用场景完全不同

  • 对象直接赋值适合需要多个变量共享同一份对象状态的场景,但要小心,改一个就全改了。
  • Object.create() 是原型继承的基础用法,适合基于现有对象创建新实例,既继承原有属性,又不会污染原对象的场景——比如你要创建不同种类的鸟,都共享鸟类的基础属性,但各自有专属特性,这时候用 Object.create() 就很合适。

给你补一段验证代码,一看就懂:

let bird = {
  hasWings: true,
  canFly: true,
  hasFeathers: true
};

// 引用赋值的情况
let eagle = bird;
eagle.canFly = false;
console.log(bird.canFly); // 输出 false,原对象被修改了

// Object.create 的情况
let penguin = Object.create(bird);
penguin.canFly = false;
console.log(bird.canFly); // 输出 true,原对象毫发无损
console.log(penguin.hasWings); // 输出 true,从原型继承来的属性

内容的提问来源于stack exchange,提问作者Sushant Kadam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:13:13