原型模式的核心是运行时动态性:通过prototype共享属性方法、[[Prototype]]链按需查找、三者关系松散可重配,class仅是原型机制的语法糖。

因为原型模式让对象能在运行时实时调整结构、共享行为、改变继承关系,而不是靠编译前固定的类定义。
原型是运行时可修改的共享池
每个函数的 prototype 属性指向一个普通对象,这个对象就是所有实例共享的“方法与属性仓库”。你随时可以往里面加新方法或改已有属性,所有已存在的实例立刻就能用——不是复制,而是通过 [[Prototype]] 指针动态查找。
- 比如先创建
const obj = new Person(),再执行Person.prototype.greet = () => console.log('hi'),obj.greet()立刻可用 - 这种“后加即生效”的能力,正是动态性的直观体现
原型链是动态查找路径,不是静态拷贝
访问 obj.name 时,引擎不会把原型上的 name 复制到 obj 里,而是按需沿 [[Prototype]] 链向上搜索。链上的任何一环被替换或增强,下次查找就走新路径。
-
obj.__proto__可以被重新赋值(如obj.__proto__ = NewProto),之后所有属性访问都转向新原型 - 甚至可以用
Object.setPrototypeOf(obj, null)切断整个链,让对象彻底“失联”于继承体系
构造函数、实例、原型三者关系松散且可重配
实例只保存对初始原型的单向指针,不绑定构造函数本身;构造函数的 prototype 属性却可以随时被整个替换。这两者解耦,使得行为注入、热更新、沙箱隔离等高级操作成为可能。
立即学习“Java免费学习笔记(深入)”;
- 重写
Person.prototype = { sayHi() {} }不会影响已存在实例(它们仍连着旧原型) - 但用
Object.create(NewProto)或Object.setPrototypeOf()可主动把老实例“迁移”到新原型上 - 原生类型如
Array.prototype也开放修改,所以你能给所有数组加上自定义方法
class 语法只是表层封装,底层仍是原型流动
ES6 的 class 看似像 Java,但编译后依然是函数 + prototype 操作。你依然能访问 MyClass.prototype,也能在运行时补方法、换原型、甚至篡改 super 链。
-
class Dog extends Animal本质是设置Dog.prototype.__proto__ = Animal.prototype - 继承链、静态方法、getter/setter 全部依托原型机制实现,没有额外的“类系统” runtime


















