javascript原型继承通过object.create()让对象直接以另一对象为原型实现复用,轻量灵活;支持只继承prototype避免实例属性污染,配合defineproperty可精确控制属性特性。

JavaScript 中原型继承实现代码复用,核心是让一个对象直接以另一个对象为原型,从而共享其属性和方法,不依赖构造函数或类声明。它轻量、灵活,适合对象间功能复用,尤其适用于无需实例化、只需行为委托的场景。
用 Object.create() 直接继承对象
这是最简洁、推荐的方式,ECMAScript 5 引入,语义清晰,避免了临时构造函数的冗余。
- 父对象可以是字面量、构造函数的 prototype,甚至空对象
- 子对象通过 Object.create(parent) 创建,自动获得 parent 的所有可枚举属性和方法(只在原型链上,不复制)
- 支持第二个参数定义自有属性(如 age、score),这些属性不会污染父对象
示例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const child = Object.create(parent);
console.log(child.say()); // 'Hi'
console.log(child.hasOwnProperty('say')); // false(来自原型)
手动模拟 Object.create(兼容旧环境)
当需支持 IE8 等老浏览器时,可用经典“圣杯模式”手动实现原型继承:
- 定义一个空构造函数 F
- 把父对象赋给 F.prototype
- 返回 new F() —— 这个新对象的 [[Prototype]] 指向父对象
示例:
function object(o) {function F() {}
F.prototype = o;
return new F();
}
const parent = { name: 'Papa' };
const child = object(parent);
console.log(child.name); // 'Papa'
只继承原型,避开实例属性干扰
若父对象由构造函数创建,直接继承其实例会导致引用类型属性被所有子对象共享(比如数组、对象),造成意外修改。此时应只继承其 prototype:
- child = Object.create(Person.prototype) → 只继承 getName 等方法,不继承 this.name 等实例属性
- 这样既复用了逻辑,又避免了数据污染
- 需要自有属性时,可在子对象上单独设置(如 child.name = 'Kid')
对比:
// ❌ 继承实例:共享 play 数组Student.prototype = new Person();
// ✅ 继承原型:干净复用方法
Student.prototype = Object.create(Person.prototype);
配合 defineProperty 精确控制继承属性
Object.create 的第二个参数允许你定义子对象自己的属性,并精确控制其可写性、可枚举性等:
- 用 descriptor 对象配置 value、writable、enumerable、configurable
- 适合构建只读配置、私有行为封装或兼容性补丁
- 注意:Object.create(null) 创建的对象没有 Object.prototype 方法(如 toString),需谨慎使用
示例:
const man = Object.create(null);Object.defineProperty(man, 'car', {
value: 'Delorean',
writable: true,
enumerable: true
});
const driver = Object.create(man);
driver.car; // 'Delorean'
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










