两种创建对象方式的核心区别: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)
作用
只创建空对象 + 继承原型,不执行构造函数
底层做了什么
- 创建一个全新的空对象
{} - 把这个空对象的
__proto__指向i.prototype - 完全不执行
function i(){}里面的代码 - 不会自动初始化
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 关键字四步走)
- 创建空对象
{} - 空对象
__proto__指向i.prototype(和 A 一样) - 把这个对象作为
this,执行构造函数i.call(this, "Bob") - 自动返回这个对象
最终对象 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
总结
Object.create(原型):纯原型继承,不跑构造函数,适合需要轻量对象、手动控制初始化的场景。new 构造函数():标准用法,自动跑构造函数 + 初始化属性,日常开发 99% 都用它。- 两者都能继承原型方法,
instanceof判断结果也完全一致。

浙公网安备 33010602011771号