JavaScript:超类中的'this'指的是子类

JavaScript: 'this' in superclass refers to subclass

我正在从 subclass 调用 superclass 方法。当从 subclass 调用时,superclass 方法中的 'this' 不再引用 superclass 而是引用调用它的 subclass 。 这会产生继承问题。

详情如下:

在我的项目中,我使用 class 从已注册的类型构造对象。 这些类型是从属性中注册的,或者是从基于已定义类型的模板中注册的:

class A{

createObject(type) {
    let object = null;
    for (let i in this.objecttypes) {
        if (this.objecttypes[i].type == type) {
            if (this.objecttypes[i].template) {
                object = this.createObject(this.objecttypes[i].template);
                object.type = type;
            }
            else
                object = new TestObject(type);
            for (const aname in this.objecttypes[i].attributes)
                object.set(aname, this.objecttypes[i].attributes[aname]);
            //console.log("Object: "+JSON.stringify(object));
        }
    }
    return object;
}

}

这在 superclass 中工作正常。不过,我还构造了一个subclass,方法更加人性化。在 subclass 中,名为 'createObject' 的方法不会 return 创建的对象。它存储它和 returns 对象 ID:

class B extends A{

createObject(type,otherargs){
    let object=super.createObject(type);
    this.objects.set(object.id,object);
    /* do things with otherargs     */
    return object.id;
}

}

/* Method to test function. In test class */

templateObjects(){
    let container=this.getContainer();
    console.log("proto: "+JSON.stringify(Object.getPrototypeOf(container)));
    let tt=App.createObjectType("template1","",[{name:"attr0",value:1},{name:"attr1",value:2},{name:"attr2",value:3}]);
    let ut=App.createObjectType("test","template1",[{name:"attr3",value:66}]);
    container.addObjectType(tt);
    container.addObjectType(ut);
    let o0=container.createObject("template1");
    console.log("Object: "+JSON.stringify(o0));
    let o1=container.createObject("test");
    console.log("Object: "+JSON.stringify(o1));
}

    

当我现在尝试从 subclass 创建基于模板的对象时,superclass 代码走到了这一步:

            if (this.objecttypes[i].template) {
                object = this.createObject(this.objecttypes[i].template);
                object.type = type;
            }

'this.createObject(...)' 调用导致调用 subclass' createObject 方法,因此 returning 一个数字键,但未能尝试为其分配类型。

我知道我可以重命名 subclass 中的方法来避免这个问题,我可以发送 class 对象('this')作为参数或者其他棘手的事情。

但是有没有更直接、更惯用的方法来解决这个问题?

this 指的是一个对象,而不是 class。在本例中,它是 B 正常使用的一个实例(即使在 A 中的代码中——只有一个对象)。因为对象的 createObject 属性 来自 B,这就是你从 this.createObject 得到的(不管代码出现在哪里)。

但还有一个更根本的问题:

当您订阅class 某物时,您是在说它是您订阅class 的东西的更专业版本。也就是说,B是一个特化的A。这意味着 B 是一个 AA 有一个特定的合同,例如它 return 是其 createObject 方法中的一个对象。通过更改 B 中的 return 类型,您将违反该合同。 B 不再是 A,它类似于 A,除了 createObject

所以我建议不要这样做,因为它违反了 subclassing 的规则之一。

可以A中的代码调用AcreateObject版本,如下所示:

object = A.prototype.createObject.call(this, this.objecttypes[i].template);

但我强烈建议您不要这样做。 :-) 相反,不要让 B 破坏 A 的合同。在 B.

中对您正在做的事情使用不同的方法