【问题标题】:Extends ES6 class dynamically动态扩展 ES6 类
【发布时间】:2019-06-06 19:17:27
【问题描述】:

如何在 js es6 中轻松实现一种混合或扩展动态多类继承?

// 这里的示例我有 3 个类,但它们需要从上下文扩展。

class Type1 { constructor() {} };
class Type2 { constructor() {} };
class Type3 { constructor() {} };

// 这里我有其他类继承但不需要上下文。

/** return dynamically a class*/
function dynamically_Extends(extendsType) {
    switch (extendsType) {
        case 'type1': return Type1 ;break;
        case 'type2': return Type2 ;break;
        case 'type3': return Type3 ;break;
        default: console.error('class not exist') ;break;
    };
};

class AA {
    constructor(type) {
        //not work: example of extend during constructor?
        extends dynamically_Extends(type); 
        super()
    };
};

class A extends AA{
    constructor(type) {
        super(type)
    };
};

当我创建对象时我希望它有这样的东西

const obj1 = new A('type1'); // class heritance: A=>AA=>type1
const obj2 = new A('type2'); // class heritance: A=>AA=>type2
const obj3 = new A('type3'); // class heritance: A=>AA=>type3

我想第二次扩展A,但根据条件使用动态上下文。 在构造函数期间或之后执行此操作的任何提示或简单方法? 我想为所有事情保留类糖代码。

【问题讨论】:

  • 我认为您必须将类移动到 dynamic_Extends 以避免语法错误。构造函数可以定义为 dynamic_Extends 内部的函数,但在类外部,因此所有三个类都可以使用相同的代码。
  • 你的用例是什么?是什么让你远离 ``type === "type1" ?新 A() : 新 B()` ?
  • A 将是 [containerSpriteSheets,containerSpineSheets,containerAnimationSheets] 扩展 baseContainer 并在需要上下文时动态扩展 [dataTypeDoor,dataTypeCase,dataTypeChara,dataTypeTree,dataTypeLight....]

标签: javascript dynamic ecmascript-6 extends es6-class


【解决方案1】:

除了类提供的所有其他好处之外,它们还承诺提供特定的 API。动态扩展将使违背此类承诺相对容易得多。 (尽管在 JS 中没有动态扩展的情况下很容易做到这一点)。例如。 obj1 支持 Type1.prototype.method1 吗? Type2.prototype.method2?

要考虑的另一种更传统(因此更易于维护和阅读)的方法可能是重新组织您的类层次结构。类Type1Type2Type3 可以继承自class A

【讨论】:

  • 问题是我还有很多其他的 hirachie class A extends AA, class B extends AA, class C extends AA 在我的上下文中我有这样的东西: 那些类:[containerSpriteSheets,containerSpineSheets,containerAnimationSheets] 继承这个类baseContainer 和仅在需要时也继承其中一个类[dataTypeDoor,dataTypeCase,dataTypeChara,dataTypeTree,dataTypeLight....]
猜你喜欢
  • 1970-01-01
  • 2020-04-28
  • 2012-05-15
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
相关资源
最近更新 更多