关于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
相关产品推荐
相关产品推荐

