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

JavaScript的Object静态方法keys、values等是否有对应实例版本?

实现方案说明

目前JavaScript原生规范中没有为Object原型内置keys()、values()、entries()这类实例方法,也没有为数组内置toObjectFromEntries()实例方法,核心原因是Object是几乎所有对象的原型根,随意添加原型方法很容易导致全局冲突,以及for...in遍历的异常行为。

你可以通过以下两种方式实现想要的链式调用风格:


方案1:扩展原型(适合个人/内部项目)

通过Object.defineProperty添加不可枚举的原型方法,不会影响常规的对象遍历:

// 扩展Object原型的相关方法
Object.defineProperties(Object.prototype, {
  keys: {
    value: function () {
      return Object.keys(this)
    },
    enumerable: false
  },
  values: {
    value: function () {
      return Object.values(this)
    },
    enumerable: false
  },
  entries: {
    value: function () {
      return Object.entries(this)
    },
    enumerable: false
  }
})

// 扩展Array原型的fromEntries转换方法
Object.defineProperty(Array.prototype, 'toObjectFromEntries', {
  value: function () {
    return Object.fromEntries(this)
  },
  enumerable: false
})

使用效果完全符合你的预期:

const bar = { a: 1, b: 2, c: 3 }
const myCoolFunction = key => [key.toUpperCase(), bar[key] * 2]

const foo = bar.keys()
  .map(myCoolFunction)
  .toObjectFromEntries()

// foo最终值为 { A: 2, B: 4, C: 6 }

注意:该方案不推荐在公共库、多人协作的大型项目中使用,存在和其他第三方库的同名扩展冲突的风险。


方案2:无侵入的链式包装工具(适合所有场景)

不需要修改原生原型,通过包装对象实现链式调用:

const objChain = (target) => ({
  keys: () => objChain(Object.keys(target)),
  values: () => objChain(Object.values(target)),
  entries: () => objChain(Object.entries(target)),
  map: (fn) => objChain(target.map(fn)),
  toObjectFromEntries: () => Object.fromEntries(target),
  get: () => target // 拆包获取原始值
})

使用方式:

const foo = objChain(bar)
  .keys()
  .map(myCoolFunction)
  .toObjectFromEntries()

内容的提问来源于stack exchange,提问作者Peter Alfvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:15:01