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
是一个 A
。 A
有一个特定的合同,例如它 return 是其 createObject
方法中的一个对象。通过更改 B
中的 return 类型,您将违反该合同。 B
不再是 A
,它类似于 A
,除了 createObject
。
所以我建议不要这样做,因为它违反了 subclassing 的规则之一。
您可以从A
中的代码调用A
的createObject
版本,如下所示:
object = A.prototype.createObject.call(this, this.objecttypes[i].template);
但我强烈建议您不要这样做。 :-) 相反,不要让 B
破坏 A
的合同。在 B
.
中对您正在做的事情使用不同的方法
我正在从 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
是一个 A
。 A
有一个特定的合同,例如它 return 是其 createObject
方法中的一个对象。通过更改 B
中的 return 类型,您将违反该合同。 B
不再是 A
,它类似于 A
,除了 createObject
。
所以我建议不要这样做,因为它违反了 subclassing 的规则之一。
您可以从A
中的代码调用A
的createObject
版本,如下所示:
object = A.prototype.createObject.call(this, this.objecttypes[i].template);
但我强烈建议您不要这样做。 :-) 相反,不要让 B
破坏 A
的合同。在 B
.