Typescript类功能混合(mixin)使用,将多个类中功能合并到一个对象

本文介绍了一个名为MixinFunc的函数,通过克隆构造函数和原型对象实现了混合多个类的功能,如a1、a2和a3。实例展示了如何创建mixCls并调用其继承的类方法。
//混合多个类为一个类
function MixinFunc(...mixins){
    class MixClass{}

    for (let m of mixins) {
        cloneProto(MixClass,m);//克隆构造函数
        cloneProto(MixClass.prototype,m.prototype);//克隆原型对象
    }
    return MixClass;
}
//克隆对象
function cloneProto(t,s){
    for (let k of Reflect.ownKeys(s)) {
        //不克隆构造函数key,原型对象key及对象名key
        if (k !== 'constructor' && k !== 'prototype' && k !== 'name'){
            let d = Object.getOwnPropertyDescriptor(s,k);//取源对象属性描述
            Object.defineProperty(t,k,d);//克隆源对象键值对目标对象
        }
    }
}

class a1{
    constructor() {
    }
    test1(){console.log('a1类的test1方法');}
}
class a2{
    constructor() {
    }
    test2(){console.log('a2类的test2方法');}
}
class a3{
    constructor() {
    }
    test3(){console.log('a3类的test3方法');}
}

let mixCls =MixinFunc(a1,a2,a3);//混合a1,a2,a3这三个类的功能到mixCls这个对象
console.log(Object.getOwnPropertyNames(mixCls.prototype));//[ 'constructor', 'test1', 'test2', 'test3' ]
//调用,因为类的方法都定义在原型对象上,所以Reflect.get要传入混合对象的原型对象
Reflect.get(mixCls.prototype,'test1')();//test1()
Reflect.get(mixCls.prototype,'test2')();//test2()
Reflect.get(mixCls.prototype,'test3')();//test3()

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宏权实验室

有你的鼓励,我会更加努力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值