构造函数通过this为新实例挂载独有属性,即在函数体内用this.属性名=值赋值;基本类型自动独有,引用类型需每次新建(如[]、{})避免共享;原型上直接赋值属于共享属性,非实例自有。

构造函数通过 this 给新实例挂载独有属性,核心在于:在构造函数内部,this 指向即将创建的新对象;对 this 赋值属性,就相当于把该属性直接添加到这个新实例上。
构造函数执行时 this 的指向
当用 new 调用构造函数时,JavaScript 引擎会自动做四件事:创建空对象、将 this 绑定到该对象、执行函数体(此时所有 this.xxx = yyy 都在给新对象添加自有属性)、返回该对象(除非显式返回非空对象)。所以只要在函数体内写 this.属性名 = 值,这个属性就是该实例独有的,不会被其他实例共享。
挂载基本类型和引用类型属性的区别
虽然都通过 this 挂载,但要注意类型差异带来的行为差异:
- 基本类型(string/number/boolean/null/undefined):每个实例拥有独立副本,互不影响
-
引用类型(object/array/function):若直接赋值同一个对象字面量或数组,多个实例会共享同一份内存 —— 这不是“独有”,而是意外共享。要保证独有,需每次新建(如
this.items = []而非this.items = sharedArray)
常见错误:在原型上误改 this 属性
如果在构造函数外部、原型上直接写 Person.prototype.name = 'default',这个 name 是原型属性,不是实例自有属性。只有在构造函数内用 this.name = 'xxx' 才能确保每个实例都有自己的 name。可通过 obj.hasOwnProperty('name') 或 Object.hasOwn(obj, 'name') 判断是否为实例自有属性。
立即学习“Java免费学习笔记(深入)”;
示例:正确挂载独有属性
✅ 正确写法(每个实例独有):
function Person(name, age) {
this.name = name; // 字符串:独有
this.age = age; // 数值:独有
this.hobbies = []; // 新建数组:独有(不共享)
this.config = { mode: 'light' }; // 新建对象:独有
}
❌ 错误写法(导致共享):
function Person(name) {
this.name = name;
this.hobbies = this.hobbies || []; // 看似安全,但若原型上有 hobbies,可能读取到共享值
// 更糟的是:
this.data = someGlobalArray; // 全局数组被所有实例共用
}


















