构造函数中必须用 new 调用并直接通过 this.xxx 赋值初始化实例属性;this 指向新创建的实例对象,非 new 调用会导致 this 指向错误;class 的 constructor 行为与此一致,需显式定义并调用 super()(子类),且应避免在构造函数中重复定义函数。

在构造函数中用 this 初始化实例属性,核心就一点:必须通过 new 调用,且在函数体内直接对 this.xxx 赋值。
构造函数里 this 的指向很明确
使用 new 调用时,JavaScript 会自动创建一个空对象,并把 this 绑定到它身上。之后所有 this.xxx = value 都是往这个新实例上挂属性。
- 不写
new直接调用,this会指向全局(非严格模式)或undefined(严格模式),导致属性挂错地方甚至报错 -
this.prototype是无效写法——实例没有prototype属性,只有函数才有 -
this.constructor.xxx =是改构造函数自身,不是初始化实例,容易引发意外共享
Class 语法中的 constructor 同样依赖 this
ES6 的 class 只是语法糖,constructor 方法内部的 this 行为和传统构造函数完全一致。
- 必须显式定义
constructor才能接收参数并赋值给实例 - 子类中若重写了
constructor,第一行必须调用super(),否则无法访问this - 可以在
constructor中做校验、设默认值、初始化内部对象(如this.cache = new Map())
实例属性和原型属性别混用
this.xxx 初始化的是每个实例独有一份的数据;而写在 prototype 上的方法或属性,是所有实例共享的。
立即学习“Java免费学习笔记(深入)”;
- 适合放实例属性的:名字、ID、开关状态(
isLoaded)、缓存容器等个性化数据 - 适合放原型上的:通用方法(
toString、validate)、常量、工具逻辑 - 避免在构造函数里重复定义函数(比如
this.handleClick = function(){}),会浪费内存
常见初始化操作可以直接写在 constructor 里
除了基础赋值,constructor 是执行轻量级初始化逻辑的合理位置。
- 设置默认值:
this.id = id ?? Date.now() - 参数校验:
if (typeof name !== 'string') throw new Error('name must be string') - 绑定回调:
this.handleClick = this.handleClick.bind(this)(仅当需保持 this 指向时) - 创建内部对象:
this.timer = null、this.events = []


















