ES7编写常用的decorator装饰器,如日志,自动发布事件,只读属性等

首先我们来看一下装饰器的使用场景及效果

 

decorator.js 

/**
 * @description 常用的修饰器
 * @author: hruomei
 * @update 
 * @date: 2020-10-19 10:12:17
 */

function isDescriptor(desc) {
    if (!desc || !desc.hasOwnProperty) {
        return false;
    }

    const keys = ['value', 'initializer', 'get', 'set'];

    for (let i = 0, l = keys.length; i < l; i++) {
        if (desc.hasOwnProperty(keys[i])) {
            return true;
        }
    }

    return false;
}
  
function decorate(handleDescriptor, entryArgs) {
    if (isDescriptor(entryArgs[entryArgs.length - 1])) {
        return handleDescriptor(...entryArgs, []);
    } else {
        return function () {
            return handleDescriptor(...Array.prototype.slice.call(arguments), entryArgs);
        };
    }
}

function handleReadonly(target, key, descriptor) {
    descriptor.writable = false;
    return descriptor;
}

function handleLog(target, key, descriptor, [message = '']) {
    if (typeof descriptor.value !== 'function') {
        throw new SyntaxError('Only functions can be marked as deprecated');
    }
        
    return {
        ...descriptor,
        value: function deprecationWrapper() {
            this.debug && console.log(`--${key}-- ${message}`, arguments);
            return descriptor.value.apply(this, arguments);
        }
    };
}

function handlePublish(target, key, descriptor, [ event, params ]) {
    if (typeof descriptor.value !== 'function') {
        throw new SyntaxError('Only functions can be marked as deprecated');
    }

    return {
        ...descriptor,
        value: function deprecationWrapper() {
            descriptor.value.apply(this, arguments);
            event && window.EventObserver.emit(event, params);
        }
    };
}

/**
 * @function: readonly
 * @description: 禁止修改函数
 * @author: hruomei
 * @date: 2020-10-26 17:16:36
 * @version: V1.0.0
 */
export function readonly(...args) {
    return decorate(handleReadonly, args);
}

/**
 * @function: log
 * @param: {String} message 输出的日志描述信息
 * @description: 调用类实例时自动输出日志
 * @author: hruomei
 * @date: 2020-10-26 17:17:14
 * @version: V1.0.0
 */
export function log(...args) {
    return decorate(handleLog, args);
}

/**
 * @function: publish
 * @param: {String} event 事件名
 * @description: 调用某个实例方法时发布事件
 * @author: hruomei
 * @date: 2020-10-26 17:17:54
 * @version: V1.0.0
 */
export function publish(...args) {
    return decorate(handlePublish, args);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值