Layabox -- 通过类型实例化对象 与 获取对象类型名

如果你在写Layabox对象池的时候不小心看到这篇文章,那么恭喜你,你写出来的对象池将会和Unity对象池一样方便灵活。
这篇文章将会把Egret、Layabox,如何通过类型获取类型名,如何通过对象获取类型名告诉大家。
一、Layabox
1、通过类型获取类型名并实例化一个对象,下面是我写的一个在对象池中根据类型名取出一个对象或实例化一个对象的方法。重点是ClassZ.name

 	/**
     * 取出一个对象
     * @param classZ Class
     * @return Object
     *
     */
    public static pop(classZ: any, ...args: any[]): any {
        let refKey = classZ.name;
        if (!ObjectPool._content[refKey]) {
            ObjectPool._content[refKey] = [];
        }
        var list: Array<any> = ObjectPool._content[refKey];
        if (list.length) {
            // 原来是pop,改成了shift,用队列方式来管理
            return list.shift();
        } else {
            var argsLen: number = args.length;
            var obj: any = new classZ(...args);
            obj.ObjectPoolKey = refKey;
            return obj;
        }
    }

2、通过对象获取类型名,下面是我的对象池中归还一个对象的写法。

	/**
     * 放入一个对象
     * @param obj
     *
     */
    public static push(obj: any): boolean {
        if (obj == null) {
            return false;
        }

        if (obj["dispose"]) {
            obj.dispose();
        }

        var refKey: any = obj["__proto__"].constructor.name;
        //保证只有pop出来的对象可以放进来,或者是已经清除的无法放入
        if (!ObjectPool._content[refKey]) {
            return false;
        }

        ObjectPool._content[refKey].push(obj);
        return true;
    }

二、Egret
1、通过类型获取类型名并实例化一个对象。和layabox对比,这次重点变成了classZ.prototype[“class”]

	/**
     * 取出一个对象
     * @param classZ Class
     * @return Object
     *
     */
    public static pop(classZ: any, ...args: any[]): any {
        let refKey = classZ.prototype["__class__"];
        if (!ObjectPool._content[refKey]) {
            ObjectPool._content[refKey] = [];
        }

        var list: Array<any> = ObjectPool._content[refKey];
        if (list.length) {
            // 原来是pop,改成了shift,用队列方式来管理
            return list.shift();
        } else {
            var argsLen: number = args.length;
            var obj: any = new classZ(...args);
            obj.ObjectPoolKey = refKey;
            return obj;
        }
    }

2、通过对象获取类型名

	/**
     * 放入一个对象
     * @param obj
     *
     */
    public static push(obj: any): boolean {
        if (obj == null) {
            return false;
        }

        if (obj["dispose"]) {
            obj.dispose();
        }

        var refKey: any = obj.ObjectPoolKey;
        //保证只有pop出来的对象可以放进来,或者是已经清除的无法放入
        if (!ObjectPool._content[refKey]) {
            return false;
        }

        ObjectPool._content[refKey].push(obj);
        return true;
    }

使用起来肯定就很方便了:

var msgVo:MessageVo = ObjectPool.pop(MessageVo);		// 从对象池取对象
ObjectPool.push(msgVo);															// 将对象存入对象池
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值