constructor方法定义在类的prototype对象上,是实例共享原型的特殊属性,指向类本身;它在new时执行并绑定this到新实例,负责初始化实例属性,而非共享逻辑。

Class 的 constructor 方法本身不是原型对象,而是类的“初始化入口”,但它和原型对象有明确且紧密的绑定关系:它定义在类的 prototype 对象上,且该 prototype 对象就是所有实例共享的原型。
constructor 是原型对象上的一个特殊属性
当你声明一个 class,JavaScript 会自动为其创建一个原型对象(即 MyClass.prototype),并把 class 中写的 constructor 方法作为该原型对象的 constructor 属性值。
- 这个
constructor属性可读可写,指向类本身(即函数/构造器) - 它不是“挂在实例上”的方法,而是原型对象自身的属性
- 每个通过
new MyClass()创建的实例,其__proto__都指向这个原型对象,因此能通过原型链访问到constructor
constructor 方法体实际运行在实例上下文中
虽然 constructor 定义在原型上,但每次 new 调用时,它会被执行一次,并且 this 指向新创建的实例。这意味着:
- 它负责初始化实例自身的属性(如
this.name = name) - 它不用于共享逻辑——共享方法应定义在 class body 中(非 constructor 内),它们会自动挂到 prototype 上
- 你不能在
constructor里定义“供所有实例复用的方法”,那样会重复创建函数,违背原型设计初衷
修改 constructor 会影响原型对象的身份标识
如果你手动改写 MyClass.prototype.constructor,比如赋值为另一个函数,那么:
- 实例的
instance.constructor就会返回那个新函数,而非原 class -
instance instanceof MyClass仍为true(因为内部仍比对__proto__链是否包含MyClass.prototype) - 但
instance.constructor === MyClass可能为false,这会影响依赖 constructor 判断类型的代码
class 语法是构造函数的语法糖,底层仍是原型机制
ES6 class 并没有引入新模型,它只是让基于原型的面向对象更简洁:
-
class A { constructor() {} foo() {} }等价于函数构造器 + 手动挂载A.prototype.foo = function(){} -
A.prototype就是实例的__proto__ -
A.prototype.constructor === A是默认成立的,也是维持原型链完整性的重要一环











