Javascript 如何在JSES6的多态性中使用this和super

Javascript 如何在JSES6的多态性中使用this和super,javascript,polymorphism,this,super,es6-class,Javascript,Polymorphism,This,Super,Es6 Class,我想有3个相关的课程。节点类、门节点类和姐妹门节点类 有不同类型的节点,它们都有id、位置、连接和一些函数 其中一种类型是门节点,它与姐妹门节点一样,具有节点类型“door”、相应的元素和一些功能。它们的id和位置以一种方式计算 然后还有姐妹门节点。它们有不同的计算id和位置的方法,并且还有一个布尔值,表示它们是姐妹门节点 这就是我想要它看起来的样子: class Node { constructor(id, pos) { this.id = id; th

我想有3个相关的课程。节点类、门节点类和姐妹门节点类

有不同类型的节点,它们都有id、位置、连接和一些函数

其中一种类型是门节点,它与姐妹门节点一样,具有节点类型“door”、相应的元素和一些功能。它们的id和位置以一种方式计算

然后还有姐妹门节点。它们有不同的计算id和位置的方法,并且还有一个布尔值,表示它们是姐妹门节点

这就是我想要它看起来的样子:

class Node {
    constructor(id, pos) {
        this.id = id;
        this.pos = pos;
        this.connections = [];
    }

    addConnection(c) {
        //A few functions all nodes need
    }
}

class DoorNode extends Node {
    constructor(door) {
        //Both of these are needed for all Nodes but are calculated in a different way for DoorNode and SisterDoorNode
        let id = this.getId(door);
        let pos = this.getPos(door);
        super(id, pos);

        //Both of these are needed in SisterDoorNode and DoorNode
        this.nodeType = "door";
        this.correspondingElement = door;
    }

    getId(door) {
        return door.id;
    }

    getPos(door) {
        return door.pos;
    }

    getDoorSize() {
        //Some calculations I need for both DoorNode + SisterDoorNode
    }
}

class SisterDoorNode extends DoorNode {
    constructor(door) {
        super(door);
        this.isSisterNode = true;
    }

    getId(door) {
        return door.id + ".2";
    }

    getPos(door) {
        return new Point(door.pos.x + 10, door.pos.y + 10);
    }
}

但是因为我不能在超级()之前使用this,所以这不起作用。解决此问题的最佳方法是什么?

因此,在“super”之前不能使用“this”,因为在基类“构造函数”完成运行之前没有“this”可引用

有几种解决方案,但它们涉及到重新构造代码

1) 像基类一样,将
id
pos
作为参数传入

2) 生成
getId
getPos
静态方法。(这将给使用静态变量带来新的复杂性)

3) 将
pos
id
设置为可选,并在超级呼叫后的某个时间进行设置

4) 你可以直接参考道具
super(door.id,door.pos)
,但这在扩展类中不起作用,扩展类在
id
pos上执行逻辑

更新以包括使用带有超级调用的静态函数的示例

class-Foo{
建造师(门){
超级(Foo.getnodefrommoor(door));
//现在可以用这个了`
}
静态GetNodeFromDoor(门){
//`this`指的是静态名称空间,而不是类的实例。
返回{
id:door.id+“.2”,
位置:新点(
门位置x+10,
门位置y+10
)
}
}

}
3)是不可能的,因为它们不是可选的。2) 在我看来,用一种简单的方式来回避问题是一种奇怪的方式,但对我来说没有意义。1) 可能是可能的,但是计算必须在不同的位置,它们不属于。。。我不确定该使用哪一个,因为您正在更改类的接口,从代码设计的角度来看,以这种方式扩展实际上没有逻辑意义。在扩展时尝试并保留相同的接口是更好的做法。我也打算推荐静态方法@icevene。我认为这是有意义的,因为在构造函数中你还没有实例,所以调用实例方法有点难闻?把计算结果放在某个不属于它们的地方是否真的更好?或者这些计算不属于那里吗?@MarkMeyer,你的意思是说使用这个是不好的。调用构造函数中的任何函数?您是否应该将所有这些放在一个单独的函数中,例如setup()函数?您是否可以为
DoorNode
SisterDoorNode
提供
getId
getPos
的实现?这将有助于缩小最佳选择的范围。给你。这就是它们的实现方式。其他任何东西都会进入深渊