ES6 Class中定义的方法默认不可枚举,因其属性描述符中enumerable为false,故Object.keys()返回空数组,而Object.getOwnPropertyNames()可列出constructor及方法名。

是的,ES6 Class中定义的方法默认都是不可枚举的(non-enumerable)。
为什么说“默认不可枚举”
这是ES6类的明确设计行为,不是偶然或兼容性妥协。所有在class体内部直接定义的实例方法(包括普通方法、getter/setter、计算属性名方法),都会被自动设置为 enumerable: false。
-
Object.keys(MyClass.prototype) 返回空数组
[],因为该方法只返回可枚举属性 -
Object.getOwnPropertyNames(MyClass.prototype) 能看到所有自有属性名,如
["constructor", "say", "speak"] - for...in 循环不会遍历这些方法,它们不会出现在继承链的枚举中
和ES5构造函数的区别
手动挂载到 prototype 上的方法(比如 MyFunc.prototype.say = function(){})默认是可枚举的,而class语法定义的方法则不是。
- ES5方式:
Object.keys(F.prototype)会列出["say", "speak"] - Class方式:
Object.keys(Demo.prototype)返回[] - 本质差异在于属性描述符中的
enumerable值不同
怎么验证一个方法是否可枚举
可以用这个小工具函数快速判断:
const isEnumerable = (prop, obj) => Object.keys(obj).includes(prop);
-
isEnumerable('say', Demo.prototype)→false -
isEnumerable('say', F.prototype)→true
这会影响什么
不可枚举性主要影响对象的序列化与反射操作:
- JSON.stringify() 忽略不可枚举属性(包括方法)
- Vue/React 等框架依赖属性枚举性做响应式追踪时,不会监听class方法
- 调试时用
console.dir(instance)可能不展开显示这些方法(取决于控制台实现)


















