首页 > 解决方案 > 访问 Objects 实例构造函数以进行克隆

问题描述

TLDR:在类方法中使用 this.constructor(props) 来复制该类有什么陷阱吗?

我有一个用例,其中为实体定义类模型证明对于整个复杂系统的管理和处理非常有用。

这些实体模型类都需要一组通用方法。

我不希望跨多个实体模型类重复代码。我正在探索 BaseEntityModel 类的使用,它可以被所有其他需要通用功能的模型类扩展。

其中一种方法是一种clone()方法,它提供对象的深层克隆作为 ExtendedEntityModel 类型。

clone()将在 BaseEntityModel 类上声明。从扩展 BaseEntityModel 类的 ExtendedEntityModel 对象调用克隆时,我想保留类名和属性。

我需要一种通过 BaseEntityModel 创建 ExtendedEntityModel 新实例的方法,而无需在调用clone(). 换句话说,我想避免使用new ParentClassEntity(),因为 BaseEntityModel 方法需要适用于它的所有扩展。

我做了一些搜索,但在这种模式上找不到太多。经过一番修修补补,我发现调用this.constructor(props)正是我想要的。请参阅下面的类和clone()功能

BaseEntityModel.js

class BaseEntityModel {
  constructor({ entityType, dataKeys }) {
    this.entityType = entityType;
    this.dataKeys = dataKeys;
  }

 /**
  * Provide deep clone of self, Preserving extended class properties
  */
  clone() {
     return new this.constructor(JSON.parse(JSON.stringify(this))); //<-- here, this.constructor
   };
}

扩展模型.js

class ExtendedModel extends BaseEntityModel {

    constructor({param1, param2} : ExtendedModel) {
        super({ entityType, dataKeys });
        this.param1 = param1;
        this.param2 = param2;
    }

}

然后使用

var extendedModel1 = new ExtendedModel({param1, param2};
var clonedExtendedModel = extendedModel1.clone(); //returns a cloned version and of type ExtendedModel

我在打电话时找不到很多东西this.constructor。任何人都可以提供一些关于为什么这可能是一个糟糕的选择的见解,或者确认这不是一个等待引爆的 JavaScript 炸弹吗?

请参阅工作实施的CodeSandbox

标签: javascriptreactjs

解决方案


推荐阅读