JavaScript中如何自动枚举并打印对象的所有私有属性?
如何枚举并打印JS类的所有属性(含私有属性)
首先明确:JavaScript的私有字段(以#开头)是类的私有成员,仅能在类内部访问,外部的常规枚举方法(比如Object.keys、JSON.stringify)无法获取这些私有字段。但可以在类内部实现逻辑,无需逐个指定就能自动收集所有属性(包括私有属性)。
实现方法
在类内部添加一个方法,利用类对私有字段的访问权限,结合Reflect.ownKeys()获取所有键(包括私有字段的特殊键),然后遍历收集键值对:
class Foo { #a; #b = 123; c = 3.14; getAllProperties() { return Reflect.ownKeys(this).reduce((props, key) => { // 类内部可以直接访问私有字段 props[key.toString()] = this[key]; return props; }, {}); } tellYourself() { const allProps = this.getAllProperties(); console.log("OK the values are", JSON.stringify(allProps)); } } const foo = new Foo(); foo.tellYourself();
执行这段代码会输出:
OK the values are {"#a":null,"#b":123,"c":3.14}
原理说明
Reflect.ownKeys(this)会返回对象的所有自有键,包括常规属性、Symbol属性以及私有字段的特殊标识键;- 由于是在类内部执行,我们可以直接通过
this[key]访问私有字段的值,无需逐个指定字段名; - 最后用
reduce把键值对整理成普通对象,方便用JSON.stringify打印。
如果想在类外部获取这些私有属性,没有合法的通用方法——这正是JS私有字段的设计初衷:强制封装,仅允许类内部访问。
内容的提问来源于stack exchange,提问作者Stefanie Gauss
相关产品推荐
相关产品推荐

