2017-03-04 79 views
0

这是事情。我有一个叫做A. 我想这个类来扩展类B.JavaScript - 类扩展条件

class A extends B {} 

但事实上,我想B类扩展C,d或E在特定的条件下一个主类:

class B extends B1 {} 

class B extends B2 {} 

class B extends B3 {} 

所以B类将是一个“假”类,只是为了检查一个条件,然后扩展正确的类。 在决赛中,结果会是一样的:

class A extends B1 {} 

class A extends B2 {} 

class A extends B3 {} 

我知道这是可能在PHP中,抽象类或包装类例如。 但如何在JavaScript ES6中做到这一点?

感谢

+0

我不知道你要解决什么问题。为什么你需要动态声明类而不是仅仅选择使用哪个类? –

+0

我需要动态地执行它,因为'A类扩展B {}'发生在每个用户请求,并且'B类扩展? {}'取决于请求类型 –

+0

这不能回答我的问题。动态声明类和动态选择类是有区别的。我需要经常做后者,前者从不,因此是一个问题。 –

回答

0

因此JavaScript类实际上不在同一经典的继承方式与其他语言设置,做你想要什么,最好的办法就是设置你正在处理的对象的原型。有几种方法。

Object.setPrototypeOf(currentObj, newPrototype); 

其中newPrototype是您想要继承的对象。如果你想学习内部工作,这里有几篇很好的文章。

http://yehudakatz.com/2011/08/12/understanding-prototypes-in-javascript/

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch5.md

+0

像魅力一样工作!感谢您的链接 –

0

怪异,但可能:

class subClassFirst { 
 

 
    report() { 
 
    console.log(`Extended ${this.name} from the first class`); 
 
    } 
 
} 
 

 
class subClassSecond { 
 

 
    report() { 
 
    console.log(`Extended ${this.name} from the second class`); 
 
    } 
 
} 
 

 
class subClassThird { 
 

 
    report() { 
 
    console.log(`Extended ${this.name} from the third class`); 
 
    } 
 
} 
 

 
function classCreator(condition) { 
 
    let sub; 
 
    switch (condition) { 
 
    case 'first': 
 
     sub = subClassFirst; 
 
     break; 
 
    case 'second': 
 
     sub = subClassSecond; 
 
     break; 
 
    case 'third': 
 
     sub = subClassThird; 
 
     break; 
 
    } 
 

 
    return (class extends sub { 
 
    constructor(name) { 
 
     super(); 
 
     this.name = name; 
 
    } 
 
    }); 
 
} 
 

 
let myClass; 
 

 
myClass = classCreator('first'); 
 
let mcf = new myClass('f'); 
 

 
myClass = classCreator('second'); 
 
let mcs = new myClass('s'); 
 

 
myClass = classCreator('third'); 
 
let mct = new myClass('t'); 
 

 
mcf.report(); 
 
mcs.report(); 
 
mct.report();