在构造函数内为this赋值是确保实例独占属性的最可靠方式,基础类型天然独占,引用类型必须每次新建;es6解构与默认值可提升初始化健壮性;子类需显式调用parent.call(this)以保证继承时属性独立。

在构造函数里直接给 this 赋值,是确保每个实例拥有独占属性的最可靠方式。只要属性是在 new 调用时、在构造函数体内动态创建的,JavaScript 就会为每个新对象分配独立内存空间,互不干扰。
在构造函数体内为 this 赋值
这是初始化独占属性的核心做法。每次执行 new Constructor(),引擎都会生成一个全新空对象,并将 this 绑定到它上面。此时对 this.xxx = value 的任何赋值,都会成为该实例独有的自有属性。
- 基础类型(字符串、数字、布尔)天然独占,无需额外处理
- 引用类型(数组、对象、函数)必须在构造函数内 每次新建,不能复用外部定义的同一个引用
- 避免把
this.skills = defaultSkillsArray这类写法放在构造函数里,除非defaultSkillsArray是每次调用都新建的
用参数解构和默认值提升健壮性
ES6+ 支持在形参位置直接解构对象或设置默认值,让初始化更安全、更灵活,也减少因传参缺失导致属性为 undefined 的情况。
- 例如:
function User({ name = 'anonymous', age = 0 } = {}) { this.name = name; this.age = age; } - 嵌套解构适合初始化配置类对象,比如
{ theme: { color, fontSize } } - 空对象默认值
= {}防止传入undefined导致解构报错
引用类型务必每次新建
数组、对象这类引用类型若初始化不当,容易造成多个实例意外共享同一份数据。关键在于:只要在构造函数体内用字面量或构造器创建,就一定是独占的。
- ✅ 安全写法:
this.items = []、this.config = { retry: true }、this.cache = new Map() - ❌ 危险写法:
const DEFAULT_ITEMS = []; function X() { this.items = DEFAULT_ITEMS; }—— 所有实例共用一个数组 - 验证是否独占:可用
obj1.arr === obj2.arr测试,结果应为false
继承场景下保持实例属性独立
子类要复用父类初始化逻辑,需在自己的构造函数中显式调用 Parent.call(this, ...)。这样父类内部对 this 的所有赋值,都会在当前子类实例上重新执行一遍。
- 例如:
function Child(name, extra) { Parent.call(this, name); this.extra = extra; } - 父类中
this.colors = ['red']会被执行两次,分别生成两个独立数组 - 不调用
Parent.call,仅靠原型链继承,只会共享原型上的属性,无法保证实例独占
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











