JavaScript中如何在构造函数内让类实例获取对象所有属性
类构造函数中将对象属性挂载到实例的实现方法
核心思路是在构造函数执行阶段,把获取到的对象的属性,批量绑定到当前实例的上下文this上,常用实现方式有两种:
方法1:使用Object.assign(最常用,满足绝大多数场景)
Object.assign会把源对象所有自有可枚举属性浅拷贝到目标对象(也就是类实例this)上,写法简洁:
class MyClass { constructor() { const object = createMyObject(); // 返回 {a:1, b:2, c:3} Object.assign(this, object); } } // 注意:class是JS保留关键字,不能作为变量名,需替换为合法标识符 const myInstance = new MyClass(); console.log(myInstance.a); // 输出 1 console.log(myInstance.b); // 输出 2 console.log(myInstance.c); // 输出 3
注意点:
- 该方法为浅拷贝,如果属性值是引用类型(对象、数组等),实例上的属性和原对象的属性会指向同一块内存地址,修改一方会影响另一方
- 不会复制源对象的不可枚举属性、属性描述符(比如getter/setter、只读配置),也不会复制原型链上的属性
方法2:使用属性描述符复制(适配特殊场景)
如果需要完整复制源对象的属性特性(包括不可枚举属性、getter/setter、读写权限配置),可以搭配Object.getOwnPropertyDescriptors和Object.defineProperties实现:
class MyClass { constructor() { const object = createMyObject(); Object.defineProperties( this, Object.getOwnPropertyDescriptors(object) ); } }
特殊场景写法
如果属性数量极少,且需要单独控制每个属性的挂载逻辑,也可以手动逐个赋值:
class MyClass { constructor() { const object = createMyObject(); this.a = object.a; this.b = object.b; this.c = object.c; } }
这种写法在属性多的时候冗余度极高,后续维护成本大,非必要不建议使用。
内容的提问来源于stack exchange,提问作者Gary Holiday
相关产品推荐
相关产品推荐

