ES6中合并两个静态类为对象结果为空,请问问题出在哪?
为什么合并类的静态方法后得到空对象?
嘿,这个问题我之前也踩过坑!核心原因其实很简单:ES6类的静态方法默认是不可枚举的,而你用的对象扩展运算符...只会复制对象自身的可枚举属性,所以直接展开A和B的时候,那些静态方法根本不会被复制到combined里。
咱们可以验证一下——在控制台运行Object.getOwnPropertyDescriptors(A),看输出的b属性描述符,会发现enumerable字段是false,这就是问题的关键!
那该怎么解决呢?这里有几种靠谱的方式:
方法一:手动遍历所有自身属性(包括不可枚举的)
用Object.getOwnPropertyNames获取类的所有自身属性名(不管是否可枚举),然后逐个赋值到新对象里:
class A { static b() { console.log('A.b') } } class B { static c() { console.log('B.c') } } const combined = {}; // 处理A的静态成员 Object.getOwnPropertyNames(A).forEach(key => { combined[key] = A[key]; }); // 处理B的静态成员 Object.getOwnPropertyNames(B).forEach(key => { combined[key] = B[key]; }); // 测试一下: combined.b(); // 输出 "A.b" combined.c(); // 输出 "B.c"
方法二:用Object.defineProperties结合属性描述符
这种方式更简洁,还能完整保留原属性的所有特性(比如是否可枚举、是否可写等):
const combined = {}; Object.defineProperties(combined, { ...Object.getOwnPropertyDescriptors(A), ...Object.getOwnPropertyDescriptors(B) });
(不推荐)手动把静态方法设为可枚举
如果你非要用扩展运算符...,可以手动修改静态方法的可枚举性,但这会破坏类的默认行为,不建议在生产代码里这么做:
class A { static b() {} } // 将b设为可枚举 Object.defineProperty(A, 'b', { enumerable: true }); class B { static c() {} } Object.defineProperty(B, 'c', { enumerable: true }); const combined = { ...A, ...B }; // 现在combined就包含b和c了
总结一下:类的静态成员默认不可枚举,扩展运算符只处理可枚举属性,所以必须用能覆盖不可枚举属性的方式来合并静态方法~
内容的提问来源于stack exchange,提问作者bthe0
相关产品推荐
相关产品推荐

