如何在JavaScript中用扩展运算符复制非函数属性?
在JavaScript/TypeScript中复制非函数属性的实现方案
当然可行,你可以通过遍历对象并筛选属性类型的方式,只复制非函数属性,避免扩展运算符直接复制所有属性(包括函数)的问题。以下是几种实用的实现方式:
1. 直接在方法中筛选非函数属性
利用Object.entries()遍历对象键值对,结合reduce()构建只包含非函数属性的新对象,再用扩展运算符整合到结果中:
getSerializableData(): Partial<this> { const nonFunctionProps = Object.entries(this).reduce((acc, [key, value]) => { if (typeof value !== 'function') { acc[key as keyof this] = value; } return acc; }, {} as Partial<this>); return { ...nonFunctionProps, subscribers: undefined, subscribersByEvent: undefined, }; }
2. 封装工具函数(匹配你的伪代码需求)
如果需要复用这个逻辑,可以封装一个类似Object.serializableFields的工具函数:
function serializableFields<T>(obj: T): Partial<T> { return Object.entries(obj).reduce((acc, [key, value]) => { if (typeof value !== 'function') { acc[key as keyof T] = value; } return acc; }, {} as Partial<T>); }
之后在你的方法中直接调用,和伪代码逻辑完全契合:
getSerializableData(): Partial<this> { return { ...serializableFields(this), subscribers: undefined, subscribersByEvent: undefined, }; }
额外说明
- 上述方法仅处理自身可枚举属性中的非函数值,如果需要包含原型链上的属性,可改用
for...in循环并结合hasOwnProperty()判断。 - 对象中的
null、undefined及其他原始类型属性会被正常保留,我们只排除typeof value === 'function'的情况。
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

