ES6类继承没有"扩展"关键词

时间:2018-06-13 21:44:50

标签: javascript class inheritance ecmascript-6

我想在没有extends关键字的es6课程中继承:

典型方法:

class Foo extends Bar {
  contructor() {
    ...
  }
}

我正在寻找的是生成具有相同签名但使用此模式的对象:

class Foo {
  contructor(Bar) {
    // use Bar class somehow
    ...
  }
}

由于

== EDITS ==

上下文:

我为JS库ami构建扩展(threejs)。 它提供了在threejs中无缝工作的新对象。

问题:

threejs有一个内部机制,可以为每个对象生成唯一的ID,这对于它的正常行为至关重要。

当前实现依赖于three作为全局变量公开,因此创建对象的任何人都必须引用它以确保id实际上是唯一的。

// in ami
// ID of this object will be unique accros all classes
// that are based of global THREE.Mesh
class Foo extends THREE.Mesh {
  contructor() {
    ...
  }
}

使用全局变量工作正常,但我想摆脱全局命名空间要求。

如果我在ami和我的应用程序中没有引用相同的基本元素,则id可能会发生冲突。

// in ami
import {Mesh} from 'three';

class Foo extends Mesh {
  contructor() {
    ...
  }
}

// in my app
import {Foo} from 'ami';
imoport {Mesh} from 'three';

const foo = new Foo(); // it uses "Mesh" from ami as a base.
const mesh = new Mesh(); // it uses current "Mesh" as a base.
// IDs will conflict...

一个可行的解决方案是我在ami构造函数中提供一个新参数,以提供three引用:

// in ami
class Foo {
  contructor(mesh) {
    ...
  }
}

// in my app
imoport {Mesh} from 'three';
import {Foo} from 'ami';

const foo = new Foo(Mesh);
const mesh = new Mesh();

但我不知道如何实施这个解决方案。

1 个答案:

答案 0 :(得分:0)

这个答案解决了最初提出的问题,并且足以帮助OP改进问题并立即获得赞成。如果你因为球门柱已经移动而没有进行投票,我会很感激。

假设你并不疯狂,这是一个学习练习,学习如何实现这个的最好方法是获取Typescript,使用extends编写一个类,使用ES5作为目标编译它,然后查看生成的JavaScript 。确保您的基类具有方法,属性,静态方法,静态属性以及具有混合必需参数和可选参数的构造函数。然后从中派生另一个类并重写一些方法并替换一些。你会看到那些认真对待它的人是如何做到的。