我可以在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. 

这可能吗?或者这是一个坏主意?

+2

你能展示一个用例吗? JavaScript没有实际的类,它们只是允许更简单的原型继承的语法糖。你将不得不通过“转换”到另一个实例来显示你的意思。 – 4castle

你将不得不为此写一个方法来替换原型(这可以被认为是一个非常糟糕的想法)。但是,您可以通过控制this并直接调用方法,将B的实例视为C

由于JavaScript是鸭式的,没有强类型,所以传统的转换(通常是类型转换)通常是没有意义的。所有状态和行为都附加到实例及其原型(即使在运行时),而不是编译器对类型的理解。

可以使用调用任何从C方法上test

C.prototype.methodName.call(test, arg1, arg2); 

call method on a function调用与指定this的功能,这样你就可以调用一个完全无关的对象上的方法(和它的工作只要他们分享合同)。

你总是可以声明拷贝构造函数把BC,使用:

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与参考CC.prototype任何方法将可以访问通过test,像上面明确C.prototype呼叫,但无需指定this和使用.call

你也可以选择将任何共享方法移动到A这个简单的选项,并且可能完全避免这个问题,但这些都是JS的等价物。