学习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
相关产品推荐
相关产品推荐

