object.create 是 javascript 中直接创建指定原型对象的方法,不调用构造函数,仅设置 [[prototype]],用于手动实现原型继承、构建纯净对象及模拟类式继承,是理解原型链与 es6 class 底层机制的关键。

Object.create 是 JavaScript 中创建对象并显式指定其原型的最直接方式,常用于手动实现原型继承——它不调用构造函数,只设置 [[Prototype]](即 __proto__),是理解原型链本质的关键工具。
基本用法:创建带指定原型的对象
语法:Object.create(proto, [propertiesObject])
-
proto:新对象的原型(必须是对象或 null);设为null可创建无原型的对象(“纯净”空对象) -
propertiesObject(可选):类似Object.defineProperties的描述符对象,用于定义自有属性
示例:
const animal = {
eat() { console.log('eating...'); }
};
<p>const dog = Object.create(animal);
dog.bark = function() { console.log('woof!'); };</p><p>dog.eat(); // eating...(从 animal 继承)
dog.bark(); // woof!(自身方法)
</p>
模拟经典「类式」继承(父类 → 子类)
要让子类型实例既能访问父类型的原型方法,又能拥有自己的构造逻辑,需三步配合:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
Object.create(Parent.prototype)设置子类原型的原型链 - 修正子类原型的
constructor指向(否则会指向父类) - 在子类构造函数中用
Parent.call(this, ...)借用父类初始化逻辑(处理自有属性)
完整例子:
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name} makes a sound.`);
};
<p>function Dog(name, breed) {
Animal.call(this, name); // 继承实例属性
this.breed = breed;
}</p><p>// 关键:设置 Dog.prototype 的原型为 Animal.prototype
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog; // 修复 constructor</p><p>Dog.prototype.bark = function() {
console.log(<code>${this.name} barks!</code>);
};</p><p>const myDog = new Dog('Max', 'Golden Retriever');
myDog.speak(); // Max makes a sound.(继承)
myDog.bark(); // Max barks!(自有)
</p>
与 ES6 class 继承对比
class extends 底层正是基于 Object.create 和 Reflect.construct 等机制实现的。例如:
class Animal { /* ... */ }
class Dog extends Animal { /* ... */ }
等价于手动设置:
Dog.prototype = Object.create(Animal.prototype)Dog.prototype.constructor = Dog-
super(...)内部调用Animal.call(this, ...)
所以 Object.create 是更底层、更透明的继承控制方式,适合需要精细原型操作或兼容老环境的场景。
常见陷阱与注意点
- 别写成
Dog.prototype = Object.create(Animal)—— 错把构造函数当原型,应传Animal.prototype - 忘记修复
constructor会导致instance.constructor === Animal,影响 instanceof 判断和序列化逻辑 -
Object.create(null)创建的对象没有toString、hasOwnProperty等默认方法,慎用于通用数据对象 - 若父类原型上有引用类型属性(如数组),通过
Object.create共享时要注意:所有子实例会共用该引用,需在构造函数中单独初始化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










