类方法默认不可枚举。这意味着它们不会出现在for...in循环、Object.keys()返回的数组及JSON.stringify()序列化结果中,是ES6为区分接口与实现、保持原型链整洁而设定的语言级保护机制。
ES6 class内部定义的方法默认不可枚举,这不是疏忽或限制,而是有意为之的保护机制——它让类的接口更干净、行为更可预测,避免方法被意外遍历或序列化。
当一个方法被标记为 enumerable: false,它就不会出现在:
这是语言层面的统一约定,目的很明确:
Object.defineProperty 添加方法时也常设 enumerable: false,class 统一继承这一实践直接查描述符最可靠:
class Person { greet() {}}const desc = Object.getOwnPropertyDescriptor(Person.prototype, 'greet');console.log(desc.enumerable); // false
对比可见:Object.keys(Person.prototype) 返回空数组,而 Object.getOwnPropertyNames(Person.prototype) 能拿到 ['constructor', 'greet']。
虽然能用 Object.defineProperty 强行修改:
Object.defineProperty(Person.prototype, 'greet', { ...desc, enumerable: true })
Object.keys(Person.prototype) 就会包含 'greet'
但这违背了 class 的抽象意图——方法本就不该作为“键列表”暴露。除非极特殊元编程需求,否则不建议覆盖该默认行为。