javascript中值类型初始值应放在prototype上以共享,引用类型必须在constructor中初始化,避免数据污染;constructor内需避免冗余计算并一次性声明属性以优化v8隐藏类性能。

JavaScript 中 constructor 里初始化实例变量,直接影响对象创建速度和内存使用。关键不是“能不能放”,而是“该不该每次新建时都执行”。合理分配初始化位置,能显著减少重复开销。
把值类型变量移到 prototype 上
数字、布尔、字符串、null、undefined 这类值类型初始值,适合直接挂到构造函数的 prototype 上。这样所有实例共享同一份默认值,避免每次 new 时重复赋值。
- 不推荐写法:每次实例化都执行赋值
this.prop1_ = 4;
this.prop2_ = true;
this.prop4_ = 'blah';
};
- 推荐写法:只在 prototype 上声明一次
foo.Bar.prototype.prop1_ = 4;
foo.Bar.prototype.prop2_ = true;
foo.Bar.prototype.prop4_ = 'blah';
注意:仅适用于不依赖构造参数或运行时状态的初始值。比如 this.id = Date.now() 就必须留在 constructor 内。
引用类型变量仍需在 constructor 中初始化
数组、对象、函数等引用类型不能简单挂到 prototype 上——否则所有实例会共享同一个引用,造成数据污染。
- 错误示例:多个实例共用一个数组
- 正确做法:每次实例化时新建独立副本
this.items_ = [];
this.cache_ = {};
};
constructor 内部避免冗余计算
如果某个变量初始化需要复杂运算(如解析配置、生成唯一 ID、调用外部方法),且该结果对所有实例都相同,应提前计算并缓存,而不是每次 new 都重算。
- 不必要:每次创建都调用
getFeatureFlags() - 可优化:在模块顶层或静态属性中预计算一次
constructor() {
this.flags = getFeatureFlags(); // 每次都执行
}
}
// → 改为:
Config.defaultFlags = getFeatureFlags();
class Config {
constructor() {
this.flags = Config.defaultFlags;
}
}
利用对象字面量一次性定义结构(V8 隐藏类友好)
V8 引擎通过隐藏类(hidden class)优化属性访问。若 constructor 中动态添加属性(尤其顺序不固定),会导致隐藏类频繁切换,降低后续访问性能。
- 不稳定写法:属性分多次添加,顺序可能变化
- 稳定写法:在构造函数开头一次性声明完整结构
function User(name, age) {
this.name = name;
this.age = age;
this.active = true;
this.tags = [];
}
这种写法让 V8 能快速建立稳定的隐藏类,提升后续属性读写效率。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











