JavaScript原型通过prototype对象实现方法共享,避免重复创建函数;但引用类型属性不可直接挂载prototype以防意外共享,应于构造函数内初始化;prototype可动态修改,所有实例即时响应;属性访问遵循原型链逐级查找机制。

JavaScript 中 Prototype 原型对象实现属性和方法共享,核心是让多个实例对象不各自保存一份副本,而是通过原型链统一访问同一个函数或数据——但要注意:方法适合共享,而引用类型属性(如数组、对象)直接挂到 prototype 上会导致意外共享,必须谨慎。
把方法定义在构造函数的 prototype 上
这是最常用也最安全的共享方式。函数是引用类型,但本身不可变;挂到 prototype 后,所有实例调用时都沿原型链找到同一份代码:
- 构造函数内部只负责初始化实例自有属性(如 this.name = name)
- 所有可复用的行为(如 sayHello、getName)统一写在 Constructor.prototype.xxx 上
- 实例没有该方法时,自动向上查找到 prototype,无需重复创建函数对象
避免在 prototype 上直接定义可变引用类型属性
如果把数组、对象等直接赋值给 prototype,所有实例会共用同一份内存空间,修改一个就影响全部:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- 错误写法:Person.prototype.hobbies = []; → p1.push('读书') 后,p2.hobbies 也会变成 ['读书']
- 正确做法:在构造函数内初始化实例专属引用属性,如 this.hobbies = [];
- 若真需默认值,可用 getter 封装或工厂函数延迟创建
运行时动态更新 prototype 实现即时生效
prototype 是普通对象,可以随时增删改,所有已存在和后续创建的实例都会立即响应变化:
- 重写已有方法:Person.prototype.sayHello = function() { ... };
- 新增方法:Person.prototype.walk = function() { console.log('walking...'); };
- 删除方法:delete Person.prototype.sayHello;
- 这种动态性是原型共享区别于“拷贝继承”的关键优势
理解原型链查找机制才能用好共享
属性/方法访问不是“静态绑定”,而是运行时逐级查找的过程:
- 先查实例自身(this)是否有该属性
- 没有则查 this.__proto__(即构造函数的 prototype)
- 仍没有则继续查 prototype.__proto__(通常是 Object.prototype)
- 最终到 null 结束,找不到就返回 undefined
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










