我可以在JavaScript中动态地将一个类的实例转换为另一个类的实例吗?
问题描述:
这个问题已经回答python:Can I dynamically convert an instance of one class to another?我可以在JavaScript中动态地将一个类的实例转换为另一个类的实例吗?
但我很好奇,如果这将是可能的JavaScript与ES6/ES2015。
class A { ... }
class B extends A { ... }
class C extends A { ... }
let test = new B();
// ... After a while I want to have an instance of C instead of B in test.
这可能吗?或者这是一个坏主意?
答
你将不得不为此或写一个方法来替换原型(这可以被认为是一个非常糟糕的想法)。但是,您可以通过控制this
并直接调用方法,将B
的实例视为C
。
由于JavaScript是鸭式的,没有强类型,所以传统的转换(通常是类型转换)通常是没有意义的。所有状态和行为都附加到实例及其原型(即使在运行时),而不是编译器对类型的理解。
可以使用调用任何从C
方法上test
:
C.prototype.methodName.call(test, arg1, arg2);
的call
method on a function调用与指定this
的功能,这样你就可以调用一个完全无关的对象上的方法(和它的工作只要他们分享合同)。
你总是可以声明拷贝构造函数把B
为C
,使用:
class C extends A {
static fromB(other: B): C {
return new C(B.foo, B.bar);
}
}
(使用流量/打字稿类型标注为清楚起见)
最后,我最不喜欢的,声称, test
实际上是C
的一个实例,其通过与原型分开:
Object.setPrototypeOf(test, C);
setPrototypeOf
将取代test
的参考B
与参考C
和C.prototype
任何方法将可以访问通过test
,像上面明确C.prototype
呼叫,但无需指定this
和使用.call
。
你也可以选择将任何共享方法移动到A
这个简单的选项,并且可能完全避免这个问题,但这些都是JS的等价物。
你能展示一个用例吗? JavaScript没有实际的类,它们只是允许更简单的原型继承的语法糖。你将不得不通过“转换”到另一个实例来显示你的意思。 – 4castle