JavaScript中的“类”本质是构造函数的语法糖,通过prototype和__proto__形成委托链,实例共享原型方法,原型链终点为Object.prototype,constructor属性维持反向关联。

JavaScript 中的“类”不是真正的类,而是函数加语法糖。所谓类与实例的底层关系,本质是构造函数 → 原型对象 → 实例对象三者之间的委托链路,原型链就是这条链的运行机制。
类(class)其实是构造函数的包装
ES6 的 class 会被编译为函数,并自动挂载 prototype 属性:
-
class Animal {}等价于function Animal() {} -
Animal.prototype是所有new Animal()实例共享的原型对象 - 类中定义的方法(如
say())会自动添加到Animal.prototype上,而非实例自身
实例通过 __proto__ 指向类的 prototype
每次用 new 创建实例时,JavaScript 会把该实例的内部 [[Prototype]](可读作 __proto__)设为构造函数的 prototype:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
const dog = new Animal()→dog.__proto__ === Animal.prototype为 true - 这个链接不是拷贝,而是动态委托:修改
Animal.prototype会立刻反映在所有已有实例上 - 箭头函数没有
prototype,普通函数才有;只有函数对象能作为构造函数被new
原型链最终都连到 Object.prototype
无论你写的是 class、function 还是字面量 {},所有普通对象的原型链终点都是 Object.prototype,再往上就是 null:
立即学习“Java免费学习笔记(深入)”;
dog.__proto__ === Animal.prototypeAnimal.prototype.__proto__ === Object.prototypeObject.prototype.__proto__ === null- 所以
dog.toString()能用,是因为它一路委托到了Object.prototype.toString
constructor 属性维持反向关联
每个原型对象默认带一个 constructor 属性,指向它的构造函数:
Animal.prototype.constructor === Animal- 实例可通过
dog.constructor回溯到创建它的类(但注意:该属性可被覆盖,不绝对可靠) - 手动重写
prototype时(如Child.prototype = new Parent()),记得补上constructor,否则会丢失关联

















