Ts使用Js拓展常用功能篇


注解:分享一些Typescript中常用到的,但是需要js拓展的知识

Object:

示例:

let type: Object = {};
type.deepClone()

拓展:

interface Object {
    /**
     * 获取属性描述
     */
    getPropertyDescriptor(property: string): PropertyDescriptor;

    /**
     * 浅拷贝当前对象
     * 注意: 仅浅拷贝属性, 继承原型链和方法等均会丢失
     */
    shallowClone(): Object;

    /**
     * 浅拷贝所有属性
     * 注意: 仅浅拷贝属性, 继承原型链和方法等均会丢失
     */
    shallowCloneTo(target: Object): void;

    /**
     * 深拷贝当前对象
     * 注意: 仅深拷贝属性, 继承原型链和方法等均会丢失
     */
    deepClone(): Object;

    /**
     * 深拷贝所有属性
     * 注意: 仅深拷贝属性, 继承原型链和方法等均会丢失
     */
    deepCloneTo(target: Object): void;

    /**
     * 清除所有属性
     */
    clearAllProperty(): void;
}
(function () {
    let p;

    p = Object.prototype;
    Object.defineProperties(p, {
        getPropertyDescriptor: {
            value: function (property: string) {
                let pd = Object.getOwnPropertyDescriptor(this, property);
                if (pd) {
                    return pd;
                }
                let prototype = Object.getPrototypeOf(this);
                if (prototype) {
                    return prototype.getPropertyDescriptor(property);
                }
                return undefined;
            },
            enumerable: false
        },
        shallowClone: {
            value: function () {
                let result = {};
                this.shallowCloneTo(result);
                return result;
            },
            enumerable: false
        },
        shallowCloneTo: {
            value: function (target: Object) {
                for (let key in this) {
                    if (key in target) {
                        let pd: PropertyDescriptor = target.getPropertyDescriptor(key);
                        if (pd && (pd.set || pd.writable)) {
                            target[key] = this[key];
                        }
                    } else {
                        target[key] = this[key];
                    }
                }
            },
            enumerable: false
        },
        deepClone: {
            value: function () {
                let jsonStr = JSON.stringify(this);
                return JSON.parse(jsonStr);
            },
            enumerable: false
        },
        deepCloneTo: {
            value: function (target: Object) {
                let obj = this.deepClone();
                for (let key in obj) {
                    if (key in target) {
                        let pd: PropertyDescriptor = target.getPropertyDescriptor(key);
                        if (pd && (pd.set || pd.writable)) {
                            target[key] = obj[key];
                        }
                    } else {
                        target[key] = obj[key];
                    }
                }
            },
            enumerable: false
        },
        clearAllProperty: {
            value: function () {
                for (let key in this) {
                    delete this[key];
                }
            },
            enumerable: false
        }
    });

String:

示例:

let type: string = '';
type.splitNum()

拓展:

interface String {
    /**
     * 根据分割符拆分字符串为数组且元素转换为数字
     */
    splitNum(separator: string, limit?: number): number[];
    splitNum(separator: RegExp, limit?: number): number[];
}

Egret:

拓展:

declare module egret {
    interface IEventDispatcher {
        /**
         * 简写, 等同于 addEventListener
         */
        on(type: string, listener: Function, thisObject: any, useCapture?: boolean, priority?: number): void;

        /**
         * 简写, 等同于 dispatchEventWith
         */
        // dispatch(type: string | number, bubbles?: boolean, data?: any, cancelable?: boolean): boolean;

        /**
         * 简写, 等同于 removeEventListener
         */
        off(type: string, listener: Function, thisObject: any, useCapture?: boolean): void;
    }

    interface EventDispatcher {
        /**
         * 简写, 等同于 addEventListener
         */
        on(type: string, listener: Function, thisObject: any, useCapture?: boolean, priority?: number): void;

        /**
         * 简写, 等同于 dispatchEventWith
         */
        dispatch(type: string | number, bubbles?: boolean, data?: any, cancelable?: boolean): boolean;

        /**
         * 简写, 等同于 removeEventListener
         */
        off(type: string, listener: Function, thisObject: any, useCapture?: boolean): void;
    }

    module DisplayObject {
        /**
         * 标记是附带了中介类的视图
         */
        var __isMediatorView: boolean;
    }

    interface DisplayObject {
        /**
         * 抛出添加事件
         */
        __dispatchAddedEvent(event?: egret.Event): boolean;

        /**
         * 移除自身
         */
        removeSelf(): void;
    }
}
(function () {
    eui.Image.prototype.dispose = function () {
        this.source = null;
        this["parseSource"]();
    }
    let f, p, t;
    p = String.prototype;
    Object.defineProperties(p, {
        splitNum: {
            value: function (separator: string | RegExp, limit?: number) {
                let arr = this.split(separator, limit);
                for (let i = 0, len = arr.length; i < len; i++) {
                    arr[i] = parseFloat(arr[i]);
                }
                return arr;
            },
            enumerable: false
        },
    });

    p = egret.EventDispatcher.prototype;
    p.on = p.addEventListener;
    // p.dispatch = p.dispatchEventWith;
    p.off = p.removeEventListener;

    p = egret.ByteArray.prototype;
    Object.defineProperties(p, {
        decodeUTF8: {
            value: function (data: Uint8Array): string {
                let fatal: boolean = false;
                let pos: number = 0;
                let result: string[] = [];
                let code_point: number;
                let utf8_code_point = 0;
                let utf8_bytes_needed = 0;
                let utf8_bytes_seen = 0;
                let utf8_lower_boundary = 0;

                while (data.length > pos) {

                    let _byte = data[pos++];

                    if (_byte == this.EOF_byte) {
                        if (utf8_bytes_needed != 0) {
                            code_point = this.decoderError(fatal);
                        } else {
                            code_point = this.EOF_code_point;
                        }
                    } else {

                        if (utf8_bytes_needed == 0) {
                            if (this.inRange(_byte, 0x00, 0x7F)) {
                                code_point = _byte;
                            } else {
                                if (this.inRange(_byte, 0xC2, 0xDF)) {
                                    utf8_bytes_needed = 1;
                                    utf8_lower_boundary = 0x80;
                                    utf8_code_point = _byte - 0xC0;
                                } else if (this.inRange(_byte, 0xE0, 0xEF)) {
                                    utf8_bytes_needed = 2;
                                    utf8_lower_boundary = 0x800;
                                    utf8_code_point = _byte - 0xE0;
                                } else if (this.inRange(_byte, 0xF0, 0xF4)) {
                                    utf8_bytes_needed = 3;
                                    utf8_lower_boundary = 0x10000;
                                    utf8_code_point = _byte - 0xF0;
                                } else {
                                    this.decoderError(fatal);
                                }
                                utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed);
                                code_point = null;
                            }
                        } else if (!this.inRange(_byte, 0x80, 0xBF)) {
                            utf8_code_point = 0;
                            utf8_bytes_needed = 0;
                            utf8_bytes_seen = 0;
                            utf8_lower_boundary = 0;
                            pos--;
                            code_point = this.decoderError(fatal, _byte);
                        } else {

                            utf8_bytes_seen += 1;
                            utf8_code_point = utf8_code_point + (_byte - 0x80) * Math.pow(64, utf8_bytes_needed - utf8_bytes_seen);

                            if (utf8_bytes_seen !== utf8_bytes_needed) {
                                code_point = null;
                            } else {

                                let cp = utf8_code_point;
                                let lower_boundary = utf8_lower_boundary;
                                utf8_code_point = 0;
                                utf8_bytes_needed = 0;
                                utf8_bytes_seen = 0;
                                utf8_lower_boundary = 0;
                                if (this.inRange(cp, lower_boundary, 0x10FFFF) && !this.inRange(cp, 0xD800, 0xDFFF)) {
                                    code_point = cp;
                                } else {
                                    code_point = this.decoderError(fatal, _byte);
                                }
                            }

                        }
                    }
                    //Decode string
                    if (code_point !== null && code_point !== this.EOF_code_point) {
                        if (code_point <= 0xFFFF) {
                            if (code_point > 0) result.push(String.fromCharCode(code_point));
                        } else {
                            code_point -= 0x10000;
                            result.push(String.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff)));
                            result.push(String.fromCharCode(0xDC00 + (code_point & 0x3ff)));
                        }
                    }
                }
                return result.join("");
            },
            enumerable: false
        }
    });

    p = egret.DisplayObject.prototype;
    Object.defineProperties(p, {
        __dispatchAddedEvent: {
            value: function (event?: egret.Event): boolean {
                return this.dispatchEventWith(egret.Event.ADDED, true);
            },
            enumerable: false
        },
        removeSelf: {
            value: function () {
                if (this.parent) {
                    this.parent.removeChild(this);
                }
            },
            enumerable: false
        }
    });

    //看看是哪个图集有资源缺失
    p = egret.BitmapText.prototype;
    Object.defineProperties(p, {
        $updateRenderNode: {
            value: function () {
                var self = this;
                var textLines = this.$getTextLines();
                var length = textLines.length;
                if (length == 0) {
                    if (egret.nativeRender && self.$font) {
                        self.$nativeDisplayObject.setDataToBitmapNode(self.$nativeDisplayObject.id, self.$font.$texture, []);
                        self.$nativeDisplayObject.setWidth(0);
                        self.$nativeDisplayObject.setHeight(0);
                    }
                    return;
                }
                var drawArr = [];
                var textLinesWidth = this.$textLinesWidth;
                var bitmapFont = self.$font;
                var node;
                if (!egret.nativeRender) {
                    node = this.$renderNode;
                    if (bitmapFont.$texture) {
                        node.image = bitmapFont.$texture.$bitmapData;
                    }
                    node.smoothing = self.$smoothing;
                }
                var emptyHeight = bitmapFont._getFirstCharHeight();
                var emptyWidth = Math.ceil(emptyHeight * egret.BitmapText.EMPTY_FACTOR);
                var hasSetHeight = !isNaN(self.$textFieldHeight);
                var textWidth = self.$textWidth;
                var textFieldWidth = self.$textFieldWidth;
                var textFieldHeight = self.$textFieldHeight;
                var align = self.$textAlign;
                var yPos = this.$textOffsetY + this.$textStartY;
                var lineHeights = this.$lineHeights;
                for (var i = 0; i < length; i++) {
                    var lineHeight = lineHeights[i];
                    if (hasSetHeight && i > 0 && yPos + lineHeight > textFieldHeight) {
                        break;
                    }
                    var line = textLines[i];
                    var len = line.length;
                    var xPos = this.$textOffsetX;
                    if (align != egret.HorizontalAlign.LEFT) {
                        var countWidth = textFieldWidth > textWidth ? textFieldWidth : textWidth;
                        if (align == egret.HorizontalAlign.RIGHT) {
                            xPos += countWidth - textLinesWidth[i];
                        }
                        else if (align == egret.HorizontalAlign.CENTER) {
                            xPos += Math.floor((countWidth - textLinesWidth[i]) / 2);
                        }
                    }
                    for (var j = 0; j < len; j++) {
                        var character = line.charAt(j);
                        var texture = bitmapFont.getTexture(character);
                        if (!texture) {
                            if (character == " ") {
                                xPos += emptyWidth;
                            }
                            else {
                                //看看是哪个图集有资源缺失
                                egret.$warn(1046, character + (bitmapFont.$resourceInfo && bitmapFont.$resourceInfo.name ? bitmapFont.$resourceInfo.name : ""));
                            }
                            continue;
                        }
                        var bitmapWidth = texture.$bitmapWidth;
                        var bitmapHeight = texture.$bitmapHeight;
                        if (egret.nativeRender) {
                            drawArr.push(texture.$bitmapX, texture.$bitmapY, bitmapWidth, bitmapHeight, xPos + texture.$offsetX, yPos + texture.$offsetY, texture.$getScaleBitmapWidth(), texture.$getScaleBitmapHeight(), texture.$sourceWidth, texture.$sourceHeight);
                        }
                        else {
                            node.imageWidth = texture.$sourceWidth;
                            node.imageHeight = texture.$sourceHeight;
                            node.drawImage(texture.$bitmapX, texture.$bitmapY, bitmapWidth, bitmapHeight, xPos + texture.$offsetX, yPos + texture.$offsetY, texture.$getScaleBitmapWidth(), texture.$getScaleBitmapHeight());
                        }
                        xPos += (bitmapFont.getConfig(character, "xadvance") || texture.$getTextureWidth()) + self.$letterSpacing;
                    }
                    yPos += lineHeight + self.$lineSpacing;
                }
                if (egret.nativeRender) {
                    self.$nativeDisplayObject.setDataToBitmapNode(self.$nativeDisplayObject.id, bitmapFont.$texture, drawArr);
                    var bounds = self.$getContentBounds();
                    self.$nativeDisplayObject.setWidth(bounds.width);
                    self.$nativeDisplayObject.setHeight(bounds.height);
                }
            },

        }
    });

    p = egret.Sprite.prototype;
    Object.defineProperties(p, {
        $hitTest: {
            value: function (stageX, stageY) {
                if (!this.$visible) {
                    return null;
                }
                var m = this.$getInvertedConcatenatedMatrix();
                var localX = m.a * stageX + m.c * stageY + m.tx;
                var localY = m.b * stageX + m.d * stageY + m.ty;
                var rect = this.$scrollRect ? this.$scrollRect : this.$maskRect;
                if (rect && !rect.contains(localX, localY)) {
                    return null;
                }
                if (this.$mask && !this.$mask.$hitTest(stageX, stageY)) {
                    return null;
                }
                var children = this.$children;
                var found = false;
                var target = null;
                for (var i = children.length - 1; i >= 0; i--) {
                    var child = children[i];
                    if (child == null || child.$maskedObject) {//判断child是不是正经的
                        continue;
                    }
                    target = child.$hitTest(stageX, stageY);
                    if (target) {
                        found = true;
                        if (target.$touchEnabled) {
                            break;
                        }
                        else {
                            target = null;
                        }
                    }
                }
                if (target) {
                    if (this.$touchChildren) {
                        return target;
                    }
                    return this;
                }
                if (found) {
                    return this;
                }
                target = egret.DisplayObject.prototype.$hitTest.call(this, stageX, stageY);
                if (target) {
                    target = this.$graphics.$hitTest(stageX, stageY);
                }
                return target;
            }
        },
    });


    RES.on = RES.addEventListener;
    RES.off = RES.removeEventListener;

    p = egret.DisplayObjectContainer.prototype;

    t = p.$doAddChild;
    Object.defineProperties(p, {
        $doAddChild: {
            value: function (child: egret.DisplayObject, index: number, notifyListeners: boolean = true): egret.DisplayObject {
                // 下面的代码用于带有中介类的 View 添加到还没有添加到舞台的父容器时的额外处理, 该 View 已经不会发送 ADDED 事件
                // 除上面的情况外, 直接添加到舞台或已存在舞台的父容器时普通显示对象和 EUI 组件逻辑均正常
                let p = Object.getPrototypeOf(child);
                let hasMediator = p.constructor.__isMediatorView;
                if (hasMediator && !this.stage) {
                    // EUI 特殊处理下, 保证第一次打开时 createChildren 和 childrenCreated 方法都执行完毕后再执行 onRegister 方法
                    if (child instanceof eui.Component && !child.$UIComponent[eui.sys.UIKeys.initialized]) {
                        child.once(eui.UIEvent.CREATION_COMPLETE, (event: eui.UIEvent) => {
                            child.on(egret.Event.ADDED_TO_STAGE, child.__dispatchAddedEvent, child);
                            child.__dispatchAddedEvent();
                        }, this);
                    }
                    // 非 EUI 直接监听添加到舞台的事件即可
                    else {
                        child.on(egret.Event.ADDED_TO_STAGE, child.__dispatchAddedEvent, child);
                    }
                }
                return t.call(this, child, index, notifyListeners);
            },
            enumerable: false
        },
        $hitTest: {
            value: function (stageX, stageY) {
                if (!this.$visible) {
                    return null;
                }
                var m = this.$getInvertedConcatenatedMatrix();
                var localX = m.a * stageX + m.c * stageY + m.tx;
                var localY = m.b * stageX + m.d * stageY + m.ty;
                var rect = this.$scrollRect ? this.$scrollRect : this.$maskRect;
                if (rect && !rect.contains(localX, localY)) {
                    return null;
                }
                if (this.$mask && !this.$mask.$hitTest(stageX, stageY)) {
                    return null;
                }
                var children = this.$children;
                var found = false;
                var target = null;
                for (var i = children.length - 1; i >= 0; i--) {
                    var child = children[i];
                    if (child == null || child.$maskedObject) {//判断child是不是正经的
                        continue;
                    }
                    target = child.$hitTest(stageX, stageY);
                    if (target) {
                        found = true;
                        if (target.$touchEnabled) {
                            break;
                        }
                        else {
                            target = null;
                        }
                    }
                }
                if (target) {
                    if (this.$touchChildren) {
                        return target;
                    }
                    return this;
                }
                if (found) {
                    return this;
                }
                return egret.DisplayObject.prototype.$hitTest.call(this, stageX, stageY);
            }
        },
    });



    /**
     * 项呈示器被移除
     * @param renderer 移除的项呈示器
     * @param index 项呈示器的索引
     * @param item 项呈示器对应的数据
     * @version Egret 2.4
     * @version eui 1.0
     * @platform Web,Native
     * @language zh_CN
     */
    eui.DataGroup.prototype["rendererRemoved"] = function (renderer, index, item) {
        renderer.off(egret.TouchEvent.TOUCH_BEGIN, this.onRendererTouchBegin, this);
        renderer.off(egret.TouchEvent.TOUCH_END, this.onRendererTouchEnd, this);
        renderer.off(egret.TouchEvent.TOUCH_CANCEL, this.onRendererTouchCancle, this);
        if (renderer["dispose"]) {
            renderer["dispose"]();
        }
    };
    eui.ListBase.prototype["rendererRemoved"] = function (renderer, index, item) {
        renderer.off(egret.TouchEvent.TOUCH_BEGIN, this.onRendererTouchBegin, this);
        renderer.off(egret.TouchEvent.TOUCH_END, this.onRendererTouchEnd, this);
        renderer.off(egret.TouchEvent.TOUCH_CANCEL, this.onRendererTouchCancle, this);
        if (renderer["dispose"]) {
            renderer["dispose"]();
        }
    };
    eui.ItemRenderer.prototype["disposeSkin"] = function (view) {
        var i, numChildren, j;//,totalFrames:int;
        numChildren = view.numChildren;
        for (i = 0; i < numChildren; i++) {
            var mc: any = view.getChildAt(i);
            if (mc) {
                //0:图片,1:九宫格,2:按钮
                if (mc instanceof eui.List) {
                    // this.disposeSkin(mc);
                    mc.$DataGroup[10] = true;
                    mc["removeAllRenderers"]();
                    mc.dataProvider = null;
                    mc.itemRenderer = null;
                } else if (mc instanceof eui.Image) {
                    (mc as eui.Image).source = null;
                    mc["parseSource"]();
                } else if (mc instanceof NameMovieClip) {
                    mc.stop();
                    mc.data = null;
                } else {
                    this.disposeSkin(mc);
                }
            }
        }
    }

    eui.ItemRenderer.prototype["dispose"] = function () {
        this.disposeSkin(this);
    }

    eui.DataGroup.prototype["measureRendererSize"] = function () {
        var values = this.$DataGroup;
        if (values[12 /* typicalItem */] == undefined) {
            this.setTypicalLayoutRect(null);
            return;
        }
        var typicalRenderer = this.createVirtualRenderer(values[12 /* typicalItem */]);
        if (!typicalRenderer) {
            this.setTypicalLayoutRect(null);
            return;
        }
        this.updateRenderer(typicalRenderer, 0, values[12 /* typicalItem */]);
        typicalRenderer.validateNow();
        var bounds = egret.$TempRectangle;
        typicalRenderer.getPreferredBounds(bounds);
        var rect = new egret.Rectangle(0, 0, bounds.width, bounds.height);
        if (this.$layout && this.$layout.$useVirtualLayout) {
            if (values[4 /* createNewRendererFlag */]) {
                this.rendererAdded(typicalRenderer, 0, values[12 /* typicalItem */]);
            }
            this.doFreeRenderer(typicalRenderer);
        }
        else {
            this.rendererRemoved(typicalRenderer, typicalRenderer.itemIndex, typicalRenderer.data);
            this.removeChild(typicalRenderer);
        }
        this.setTypicalLayoutRect(rect);
        values[4 /* createNewRendererFlag */] = false;
    };

    eui.Scroller.prototype["onRemoveListeners"] = function () {
        var stage = this.tempStage || this.$stage;
        this.removeEventListener(egret.TouchEvent.TOUCH_MOVE, this.onTouchMove, this);
        stage.removeEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEnd, this, true);
        stage.removeEventListener(egret.TouchEvent.TOUCH_MOVE, this.onTouchMove, this);
        this.removeEventListener(egret.TouchEvent.TOUCH_CANCEL, this.onTouchCancel, this);
        this.removeEventListener(egret.Event.REMOVED_FROM_STAGE, this.onRemoveListeners, this);

        var values = this.$Scroller;
        var touchScrollH = 8; //touchScrollH
        var touchScrollV = 9; //touchScrollV
        var viewport = this.$Scroller[10 /* viewport */];
        var uiValues = viewport.$UIComponent;
        if (values[touchScrollH].isStarted()) {
            values[touchScrollH].finish(viewport.scrollH, viewport.contentWidth - uiValues[eui.sys.UIKeys.width]);
        }
        if (values[touchScrollV].isStarted()) {
            values[touchScrollV].finish(viewport.scrollV, viewport.contentHeight - uiValues[eui.sys.UIKeys.height]);
        }
    }

    Long.prototype["_toNumber"] = function () {
        return this._high * ((1 << 16) * (1 << 16)) + (this._low >>> 0);
    }

    egret.Tween.removeTweens = function (target) {
        if (!target) {
            return;
        }
        if (!target.tween_count) {
            return;
        }
        var tweens = egret.Tween["_tweens"];
        for (var i = tweens.length - 1; i >= 0; i--) {
            if (tweens[i]._target == target) {
                tweens[i].paused = true;
                tweens.splice(i, 1);
            }
        }
        target.tween_count = 0;
    };


    /**
    * @private
    * 解析source
    */
    eui.Image.prototype["parseSource"] = function () {
        var _this = this;
        this.sourceChanged = false;

        if (this.lastSource != this._source) {

            if (this.lastSource) {
                ImageCacheManager.Instance.returnAutoReleaseTexture(_this.lastSource);
            }
            this.lastSource = _this._source;
            var thizzSource = _this._source;
            if (_this._source) {
                if (typeof _this._source == "string") {
                    var result = RES.config.getResourceWithSubkey(thizzSource);
                    if (result && result.r && result.r.extra != 1) {
                        let data = RES.getRes(thizzSource);
                        if (data) {
                            _this.$setBitmapData(data);
                            _this.dispatchEventWith(egret.Event.COMPLETE);
                        }
                        else {
                            RES.getResAsync(thizzSource, function (data) {

                                if (thizzSource !== _this._source)
                                    return;
                                if (!egret.is(data, "egret.Texture")) {
                                    return;
                                }
                                _this.$setBitmapData(data);
                                if (data) {
                                    _this.dispatchEventWith(egret.Event.COMPLETE);
                                }
                                else if (true) {
                                    egret.$warn(2301, thizzSource);
                                }
                            }, this);
                        }
                    } else {
                        ImageCacheManager.Instance.addAutoReleaseTextureCount(_this._source);
                        if (ImageCacheManager.Instance.hasAutoReleaseTexture(_this._source)) {
                            var cacheTexture = ImageCacheManager.Instance.getAutoReleaseTexture(_this._source);
                            _this.$setBitmapData(cacheTexture);
                            if (cacheTexture) {
                                _this.dispatchEventWith(egret.Event.COMPLETE);
                            }
                        } else {
                            RES.getResByUrl(thizzSource, (data, url) => {
                                let refernceCount = ImageCacheManager.Instance.getRefrenceCount(thizzSource);
                                if (refernceCount <= 0 || refernceCount == undefined && data) {
                                    // data.dispose();
                                    // return;
                                }
                                if (!egret.is(data, "egret.Texture")) {
                                    return;
                                }
                                ImageCacheManager.Instance.setAutoReleaseTexture(thizzSource, data);
                                if (thizzSource !== _this._source)
                                    return;

                                _this.$setBitmapData(data);

                                if (data) {
                                    _this.dispatchEventWith(egret.Event.COMPLETE);
                                }
                                else if (true) {
                                    egret.$warn(2301, thizzSource);
                                }
                            }, this, RES.NCImg);

                        }
                    }

                } else {
                    this.$setBitmapData(thizzSource);
                }


                // if (App.asset.hasAutoReleaseBmp(url))
                //     bmpLoaded(this, url, App.asset.getAutoReleaseBmp(url));
                // else {
                //     App.mloader3.loadBMD(realUrl, 1, new Handler(bmpLoaded, [this, url]), null, null, false);
                // }

            } else {
                this.$setBitmapData(null);
            }
        }
    };
    egret.web["WebGLRenderContext"].blendModesForGL["lighter"] = [775, 1];


    // egret.web["blendModes"] = ["source-over", "lighter", "destination-out", "screen"];

    /**
     * 输入文本,聚焦和失焦 处理键盘快捷键
     */
    egret.InputController.prototype["focusHandler"] = function (event) {
        //不再显示竖线,并且输入框显示最开始
        if (!this._isFocus) {
            PcKeyBoardManager.canUseKB = false;
            this._isFocus = true;
            if (!event["showing"]) {
                this._text.$setIsTyping(true);
            }
            this._text.dispatchEvent(new egret.FocusEvent(egret.FocusEvent.FOCUS_IN, true));
        }
    };

    egret.InputController.prototype["blurHandler"] = function (event) {
        if (this._isFocus) {
            PcKeyBoardManager.canUseKB = true;
            //不再显示竖线,并且输入框显示最开始
            this._isFocus = false;
            this.tempStage.removeEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onStageDownHandler, this);
            this._text.$setIsTyping(false);
            //失去焦点后调用
            this.stageText.$onBlur();
            this._text.dispatchEvent(new egret.FocusEvent(egret.FocusEvent.FOCUS_OUT, true));
        }
    };
})();
declare module RES.processor {
    var pvrProcessor: Processor;
}

RES.processor.pvrProcessor = {
    onLoadStart: function (host, resource) {
        return host.load(resource, "ktx").then(function (colorTex) {
            if (!colorTex) {
                return null;
            }
            if (resource['etc1_alpha_url']) {
                var r_1 = RES.processor.makeEtc1SeperatedAlphaResourceInfo(resource);
                return host.load(r_1, "ktx")
                    .then(function (alphaMaskTex) {
                        if (colorTex && colorTex.$bitmapData && alphaMaskTex.$bitmapData) {
                            colorTex.$bitmapData.etcAlphaMask = alphaMaskTex.$bitmapData;
                            host.save(r_1, alphaMaskTex);
                        }
                        else {
                            host.remove(r_1);
                        }
                        return colorTex;
                    }, function (e) {
                        host.remove(r_1);
                        throw e;
                    });
            }
            return colorTex;
        }, function (e) {
            host.remove(resource);
            throw e;
        });

    },
    onRemoveStart: function (host, resource) {
        var colorTex = host.get(resource);
        if (colorTex) {
            colorTex.dispose();
        }
        if (resource['etc1_alpha_url']) {
            var r = RES.processor.makeEtc1SeperatedAlphaResourceInfo(resource);
            var alphaMaskTex = host.get(r);
            if (alphaMaskTex) {
                alphaMaskTex.dispose();
            }
            host.unload(r); //这里其实还会再删除一次,不过无所谓了。alphaMaskTex已经显示删除了
        }
    }
};
RES.processor["_map"]["pvrtc.ktx"] = RES.processor.pvrProcessor;

//文本是2个字,中间加空格
Object.defineProperty(eui.Button.prototype, "label", {
    /**
     * Text to appear on the Button control.
     * @version Egret 2.4
     * @version eui 1.0
     * @platform Web,Native
     * @language en_US
     */
    /**
     * 要在按钮上显示的文本。
     * @version Egret 2.4
     * @version eui 1.0
     * @platform Web,Native
     * @language zh_CN
     */
    get: function () {
        return this._label;
    },
    set: function (value) {

        if (typeof value === "string" && value.length === 2) {
            value = `${value[0]} ${value[1]}`;
        }

        this._label = value;
        if (this.labelDisplay) {
            this.labelDisplay.text = value;
        }
    },
    enumerable: true,
    configurable: true
});

源码