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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:24:54