为何Object.keys(Class.prototype)与Object.keys(Proto.prototype)结果不同?
为什么Object.keys(Class.prototype)无法列出ES6类的方法?
核心原因是:ES6类中定义的方法默认是不可枚举属性,而传统构造函数原型上直接赋值的方法是可枚举属性,而Object.keys()只会返回对象自身的可枚举属性名。
具体验证
我们可以通过Object.getOwnPropertyDescriptor()查看属性的描述符,直接看到两者的差异:
class Class { whoami() { return "class"; } } function Proto() {} Proto.prototype.whoami = function () { return "proto"; } // 查看类原型方法的属性描述符 console.log(Object.getOwnPropertyDescriptor(Class.prototype, 'whoami')); // 输出:{ value: [Function: whoami], writable: true, enumerable: false, configurable: true } // 查看传统原型方法的属性描述符 console.log(Object.getOwnPropertyDescriptor(Proto.prototype, 'whoami')); // 输出:{ value: [Function: whoami], writable: true, enumerable: true, configurable: true }
能明显看到,类的whoami方法的enumerable字段是false,而传统方式添加的方法是true,这就是Object.keys返回结果截然不同的关键。
补充说明
- ES6类的这种设计是有意为之:类的方法属于对象的“行为”,通常不需要被枚举(比如
for...in循环不会遍历到它们),这更符合面向对象的设计预期,避免意外枚举到方法。 - 如果需要获取类原型上的所有自身属性(包括不可枚举的),可以使用
Object.getOwnPropertyNames():console.log(Object.getOwnPropertyNames(Class.prototype)); // ["constructor", "whoami"]
内容的提问来源于stack exchange,提问作者kumarchandresh
相关产品推荐
相关产品推荐

