原型式继承的核心是基于现成对象生成可独立修改的新对象,通过__proto__指向原对象实现属性方法共享,但引用类型仍会共享,需结合浅拷贝保障数据隔离。
原型式继承的核心不是创建新类,而是基于一个现成对象,快速生成结构相似、可独立修改的新对象。它不依赖构造函数,直接复用已有对象的属性和方法,适合轻量级对象复用场景。
一、理解原型式继承的本质
原型式继承的本质是“以对象为模板,通过原型链挂载实现属性与方法的共享”。它不新建类型,只生成实例;新对象的 __proto__ 指向原对象,因此能访问原对象的所有可枚举属性和原型方法,但自身新增或修改的属性不会影响原对象(基本类型)——不过引用类型仍会共享,这点需特别注意。
二、手动实现 object() 工厂函数
这是道格拉斯·克罗克福德提出的经典写法,模拟 Object.create() 的底层逻辑:
- 定义一个空构造函数 F
- 将传入的对象 o 赋给 F.prototype
- 返回 new F() 实例,该实例的原型即为 o
示例:
function object(o) {function F() {}
F.prototype = o;
return new F();
}
const person = { name: "张三", friends: ["李四"] };
const person1 = object(person);
person1.name = "王五"; // 独立修改
person1.friends.push("赵六"); // 注意:friends 是引用类型,原对象也被改了
三、使用 Object.create() 更安全便捷
现代 JavaScript 推荐直接使用原生 Object.create(proto, propertiesObject):
- 第一个参数指定新对象的原型(即要“继承”的源对象)
- 第二个参数可选,用于定义新对象自身的属性(含 getter/setter、是否可枚举/可配置等)
- 避免了手动构造函数的冗余,且语义清晰
示例(解决引用共享问题):
const person = { name: "张三", friends: ["李四"] };const person1 = Object.create(person, {
name: { value: "王五", writable: true },
friends: { value: [...person.friends], writable: true } // 浅拷贝数组,隔离引用
});
四、结合浅拷贝做安全扩展
原型式继承本身不拷贝数据,仅建立原型链接。若需真正隔离引用类型(如数组、嵌套对象),应在创建后手动处理:
- 对基础引用类型(Array、Date、RegExp 等)做浅拷贝:[...arr]、new Date(date)
- 对简单对象可用 Object.assign({}, obj) 或展开语法 {...obj}
- 若需完全隔离嵌套结构,才考虑深拷贝(如 JSON.parse(JSON.stringify()) 或 structuredClone)
关键原则:原型继承负责“行为复用”,数据隔离靠显式拷贝——两者配合,才能既高效又安全。

















