将此绑定到es6类构造函数

时间:2018-02-14 09:38:52

标签: javascript

我正在尝试将this应用于es6类的构造函数,以获得某种类似的“构造函数合并”:

class D {
    constructor(name){
        this.name=name
        this.methodD=function(){}
    }
}
class C extends D {
    constructor(name,name2){
        super(name)
        this.name2=name2
    }
}


function Custom(name,name2){
    if (this instanceof Custom){
         Function.prototype.bind.call(C.prototype.constructor,this,...arguments)
    }
}
Custom.prototype.method=function(){}
const cc=new Custom('name','name2')

我希望使用与cc相同的构造函数构建C,因此获取cc.name='name';cc.methodD();

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您可以尝试在C内创建Custom的新实例,并使用es6 Object.setPrototypeOf()重新定义原型。

请注意,在这种情况下,Custom只返回将构建为C的对象,其原型不包含C.prototypeD.prototype的方法,只有他们的自己的方法,例如methodD类的D

另请注意,根据MDN文章,此方法可能会影响浏览器的性能。

class D {
    constructor(name){
        this.name=name
        this.methodD=function(){}
    }
}
class C extends D {
    constructor(name,name2){
        super(name)
        this.name2=name2
    }
}


function Custom(name,name2){
    let cls = new C(...arguments);
    Object.setPrototypeOf(cls, Custom.prototype);
    return cls;
}
Custom.prototype.method=function(){}
const cc=new Custom('name','name2')

console.log(cc.name)
console.log(cc.name2)
console.log(cc.methodD)
console.log(cc instanceof Custom)