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
相关产品推荐
相关产品推荐

