两种创建对象方式的核心区别:Object.create vs new

首先展示一下Object.create和new创建的源代码,如下所示:

function i(name) {
    this.name = name; // 构造函数体内的代码:初始化属性
    console.log("构造函数 i 被执行了!");
}
// 定义在原型上的方法
i.prototype.sayHi = function() {
    return "Hi, " + this.name;
};
// 方式 A:使用 Object.create
const a = Object.create(i.prototype);

// 方式 B:使用 new
const b = new i("Bob");
这段代码完美展示了 JavaScript 中创建「继承构造函数原型」对象 的两种底层方式,我给你讲清楚它们的本质区别、执行结果、适用场景
 

先看执行结果(直接运行代码)

构造函数 i 被执行了!
👉 只有 new i() 会执行构造函数Object.create 完全不会执行构造函数体!
 

 

1. 方式 A:Object.create(i.prototype)

作用

只创建空对象 + 继承原型,不执行构造函数

底层做了什么

  1. 创建一个全新的空对象 {}
  2. 把这个空对象的 __proto__ 指向 i.prototype
  3. 完全不执行 function i(){} 里面的代码
  4. 不会自动初始化 this.name 等属性

最终对象 a 的状态

const a = Object.create(i.prototype);
console.log(a); // 空对象 {}
console.log(a.name); // undefined(没有初始化属性)
console.log(a.sayHi()); // Hi, undefined(能调用原型方法)
console.log(a instanceof i); // true(继承关系成立)
核心特点
  • ✅ 继承原型方法
  • ✅ 不执行构造函数
  • ❌ 无实例属性(需要手动赋值)
 

 

2. 方式 B:new i("Bob")

作用

创建对象 + 继承原型 + 自动执行构造函数 + 初始化属性

底层做了什么(new 关键字四步走)

  1. 创建空对象 {}
  2. 空对象 __proto__ 指向 i.prototype(和 A 一样)
  3. 把这个对象作为 this,执行构造函数 i.call(this, "Bob")
  4. 自动返回这个对象

最终对象 b 的状态

const b = new i("Bob");
console.log(b); // { name: 'Bob' }
console.log(b.name); // Bob
console.log(b.sayHi()); // Hi, Bob
console.log(b instanceof i); // true
核心特点
  • ✅ 继承原型方法
  • 自动执行构造函数
  • 自动初始化实例属性
  • ✅ 最常用、最标准的创建方式
 

 

一句话总结核心区别

 
方式 执行构造函数 自动初始化属性 继承原型
Object.create ❌ 不执行 ❌ 无 ✅ 是
new 构造函数() ✅ 执行 ✅ 有 ✅ 是
 

 

补充:如果想让 Object.create 也拥有属性

 
可以手动调用构造函数初始化:
 
const a = Object.create(i.prototype);
i.call(a, "Alice"); // 手动执行构造函数,绑定 this
console.log(a.name); // Alice
console.log(a.sayHi()); // Hi, Alice
 
 

 

总结

 
  1. Object.create(原型):纯原型继承,不跑构造函数,适合需要轻量对象、手动控制初始化的场景。
  2. new 构造函数():标准用法,自动跑构造函数 + 初始化属性,日常开发 99% 都用它。
  3. 两者都能继承原型方法,instanceof 判断结果也完全一致。
posted @ 2026-04-02 11:04  chenlight  阅读(2)  评论(0)    收藏  举报