javascript代码复用核心是原型放方法、构造函数放属性,实现共享行为与独立状态分离;object.create支持纯委托复用;class是原型链的语法糖;抽象基于行为协议而非类型检查。

JavaScript 的代码复用与抽象,核心不在“写多少”,而在“放哪儿”——把共性逻辑放在原型上,把个性数据留在实例里。这种分离让 10 个对象共享一个方法,而不是各自拷贝一份。
原型上放方法,构造函数里放属性
每个实例都该有自己独有的状态(比如 name、id),这些写在构造函数内部;而所有实例通用的行为(比如 save()、validate()),统一挂到 prototype 上。
- 构造函数负责初始化独立数据:
function User(name) { this.name = name; } - 原型负责提供共享能力:
User.prototype.greet = function() { return 'Hi, ' + this.name; }; - 这样创建 1000 个 User 实例,greet 方法只占一份内存,不是 1000 份
用 Object.create 实现纯对象委托复用
不总需要构造函数。当只是想让一个对象“借用”另一个对象的能力时,Object.create 是最轻量的方式。
const animal = { move() { console.log('moving'); } };const dog = Object.create(animal); dog.bark = () => console.log('woof');-
dog.move()能运行,因为 dog.__proto__ === animal - 没有构造函数、没有 new,只有明确的委托关系,适合配置对象、工具集组合等场景
ES6 class 是语法糖,但继承逻辑没变
class 看起来像传统面向对象,但底层仍是原型链。它只是把 prototype 和 extends 的写法变得更清晰。
class Vehicle { constructor(brand) { this.brand = brand; } start() { console.log(this.brand + ' started'); } }class Car extends Vehicle { honk() { console.log('beep!'); } }- 本质是:Car.prototype.__proto__ 指向 Vehicle.prototype,查找 start() 时自动上溯
- 仍可手动操作原型:
Car.prototype.toString = () => 'a car';
抽象靠“协议”,不是靠强制类型
JavaScript 不检查“是不是 Animal 类型”,而是看“有没有 eat 方法”。这种基于行为的抽象更灵活。
- 写一个通用函数:
function feed(animal) { if (typeof animal.eat === 'function') animal.eat(); } - 任意对象,只要实现了 eat,就能被 feed —— 不管它怎么构造、是否继承自某个类
- 配合原型,你可以让多个不相关的对象轻松满足同一协议,比如 render()、serialize()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











