实例属性应放在构造函数中(如name、age、favorites数组),确保每个实例独立;原型方法应放在prototype上(如sing、addFavorite),实现共享与节省内存。

构造函数中合理分配实例属性与原型方法,核心在于区分“每个实例独有的数据”和“所有实例共用的行为”。分配错位会导致内存浪费或逻辑错误。
哪些该放在构造函数里(实例成员)
所有需要独立副本、彼此隔离的值,都应通过 this 在构造函数内部定义:
- 基本类型属性(如
name、age、id)——每个实例必须有自己的一份 - 引用类型属性(如
this.skills = []、this.config = {})——避免多个实例意外共享同一数组或对象 - 依赖当前实例状态的闭包或回调(如绑定
this的事件处理器)
哪些该挂在 prototype 上(原型方法)
函数体完全相同、不依赖私有变量、不修改实例独有状态的方法,应统一定义在 prototype 上:
- 通用行为:如
sayName()、getInfo()、isValid() - 纯计算逻辑:如
calculateTotal()、formatDate() - 不修改
this内部数据,仅读取并返回结果的方法
这样所有实例共享同一个函数引用,节省内存,且修改一处即全局生效。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
避免常见误配
以下写法看似可行,实则隐患明显:
- ❌ 在构造函数内重复定义方法:
this.sing = function() { ... }→ 每个实例都新建一份函数,浪费内存 - ❌ 把可变数据挂到 prototype:
Star.prototype.friends = []→ 所有实例共用一个数组,增删操作互相影响 - ❌ 忘记修复 constructor:
Star.prototype = { sing() {...} }后未加constructor: Star→ 实例.constructor指向Object,破坏类型识别
推荐写法示例
清晰分离,兼顾可读性与性能:
function Star(name, age) {
this.name = name; // 实例属性:各自独立
this.age = age;
this.favorites = []; // 实例属性:避免共享引用
}
// 原型方法:所有实例共享
Star.prototype.sing = function() {
console.log(`${this.name} 在唱歌`);
};
Star.prototype.addFavorite = function(item) {
this.favorites.push(item); // 修改的是当前实例的 favorites
};
Star.prototype.getAgeGroup = function() {
return this.age < 30 ? '青年' : '资深';
};

















