JavaScript 的 prototype 是基于原型编程的核心机制,函数的 prototype 属性指向实例的隐式原型,属性查找通过原型链委托向上进行,Object.create() 和 class 都是其不同表现形式。

JavaScript 中的 prototype 是基于原型编程的核心机制,它不靠类模板,而是靠对象与对象之间的“委托关系”来实现复用和继承。理解 prototype,关键不是记住语法,而是看清“谁指向谁、查什么、往哪找”这三件事。
prototype 是函数才有的属性,指向实例的共享原型对象
每个函数(包括构造函数)都有一个 prototype 属性,它是一个普通对象,默认带一个 constructor 属性指向该函数本身。这个 prototype 对象,就是将来所有通过 new Fn() 创建的实例的**隐式原型**(即它们的 [[Prototype]])。
function Person(name) { this.name = name; }Person.prototype.sayHi = function() { console.log('Hi, ' + this.name); };-
const p1 = new Person('Alice');→ 此时p1.__proto__ === Person.prototype为 true
对象创建时自动链接原型,属性查找走委托链
当你访问 p1.sayHi,JS 引擎会:
- 先在
p1自身找sayHi—— 没有 - 接着去
p1.__proto__(也就是Person.prototype)里找 —— 找到了,执行 - 如果还没找到,继续往上查
Person.prototype.__proto__(即Object.prototype),直到null
这条从实例出发、逐级向上查找的路径,就是原型链。它让多个实例能共享同一份方法,节省内存,也构成“继承”的基础。
立即学习“Java免费学习笔记(深入)”;
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
手动控制原型链:Object.create() 是最直接的方式
不用 new,也能构建原型关系:
const animal = { eats: true };-
const rabbit = Object.create(animal);→rabbit.__proto__ === animal -
console.log(rabbit.eats); // true—— 委托成功
这种方式跳过构造函数,直指原型委托本质,适合需要精细控制原型结构或实现纯对象继承的场景。
ES6 class 只是语法糖,底层仍是 prototype
class 看起来像传统面向对象,但编译后还是操作 prototype:
class Dog { constructor(name) { this.name = name; } bark() { return 'Woof!'; } }- 等价于在
Dog.prototype上定义了bark方法 -
const d = new Dog('Leo');→d.__proto__ === Dog.prototype
所以 class 并没有改变原型机制,只是让写法更清晰、继承更直观,背后仍是 prototype 链驱动。


















