You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

学习JS类方法的困惑:构造函数内外定义方法的区别

构造函数内部与类体中定义方法的区别

首先要纠正一个误解:你示例里constructor内部的displayName并不是挂载在原型上,而是每个实例对象自身的属性;而类体中定义的getAge才是挂载在类的原型(employee.prototype)上的。两者核心区别如下:

  • 内存占用差异

    • 类体中定义的方法(如getAge):所有实例共享同一个方法引用,只会在原型上创建一次,节省内存。
    • 构造函数内定义的方法(如displayName):每创建一个employee实例,就会新建一个独立的函数对象,每个实例都持有自己的方法副本,会占用更多内存。
  • 继承与原型链表现不同

    • 原型上的方法(getAge):可以被子类继承,子类实例能通过原型链访问到该方法;如果修改employee.prototype.getAge,所有实例(包括已创建的)都会受到影响。
    • 实例自身的方法(displayName):不会被继承,子类实例无法通过原型链访问到这个方法;只能通过修改具体实例的displayName来更改单个实例的行为。
  • 方法的可枚举性

    • 类体中定义的原型方法:默认是不可枚举的(Object.getOwnPropertyDescriptor(employee.prototype, 'getAge').enumerable返回false)。
    • 构造函数内赋值给this的方法:默认是可枚举的(Object.getOwnPropertyDescriptor(实例, 'displayName').enumerable返回true),会被for...in循环遍历到。
  • 使用场景不同

    • 原型方法(类体定义):适合所有实例共享的通用逻辑,比如获取属性、通用业务操作等。
    • 实例方法(构造函数内定义):适合需要每个实例拥有独立逻辑的场景,比如方法内部依赖构造函数内的局部变量(闭包场景),或者需要动态生成不同逻辑的方法。

用你提供的代码举例验证:

const emp1 = new employee('Alice', 25);
const emp2 = new employee('Bob', 30);

// 原型方法是同一个引用
console.log(emp1.getAge === emp2.getAge); // 输出 true

// 实例方法是不同的函数对象
console.log(emp1.displayName === emp2.displayName); // 输出 false

内容的提问来源于stack exchange,提问作者Adri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:54