如何从派生类中生成javascript基类实例

时间:2020-08-06 17:33:28

标签: javascript

我的应用程序在两个进程之间传递共享基类的实例,每个实例都从基类中分别派生出来以进行特殊行为。在Process1中,我具有派生类的实例,我需要从该实例生成基类实例以传递给Process2。以下代码有效,但似乎应该有一种更通用的方式来处理这种情况。关于如何重写generateBase()的任何建议,以便在将新属性添加到base的情况下仍然可以工作?

// base.js included in Process1 and Process2
class base {
    constructor(attribute1, att2) {
        this._a1 = attribute1;
        this._a2 = att2;
    }
}
// derived1.js included only in Process1
class derived1 extends base {
    constructor(a1, a2, a3) {
        super(a1, a2);
        this._a3 = a3;
    }
    generateBase() {
        // base instance to be passed to Process2
        return new base(this._a1, this._a2);
    }                        
    // Other Process1-specific functionality...
}
// derived2.js included only in Process2
class derived2 extends base {
    constructor(a1, a2, a4) {
        super(a1, a2);
        this._a4 = a4;
    }
    // Other Process2-specific functionality...

2 个答案:

答案 0 :(得分:0)

在您的示例中,派生 base 的子代,这意味着您可以使用它,因为它是 base 对象

class base {
    constructor(attribute1, att2) {
        this._a1 = attribute1;
        this._a2 = att2;
    }
}
class derived extends base {
    constructor(a1, a2, a3) {
        super(a1, a2);
        this._a3 = a3;
    }
    generateBase() {
        // became useless
        return this;
    }                        
}

答案 1 :(得分:0)

这是我作为通用解决方案提出的。我在base内部创建一个静态实例,然后使用它遍历属性并建立新结构。

class base {
    constructor(attribute1, att2) {
        this._a1 = attribute1;
        this._a2 = att2;
    }
    static baseInstance = new base(1,2);
    generateBase() {
        let props = {};
        const keys = Object.keys(base.baseInstance);
        for (let i = 0; i < keys.length; i++) {
            props[keys[i]] = this[keys[i]];
        }
        return props;
    }       
}
// derived1.js included only in Process1
class derived1 extends base {
    constructor(a1, a2, a3) {
        super(a1, a2);
        this._a3 = a3;
    }
}
// derived2.js included only in Process2
class derived2 extends base {
    constructor(b, a4) {
        super(1,2);
        Object.assign(this, b);
        this._a4 = a4;
    }
    // Other Process2-specific functionality...
}