基于 Proxy & Reflect 的追踪器

今天又看到 Proxy 的文章,花一个点时间写了一个基于
Proxy & Reflect 的追踪器。

貌似并没有什么实现的必要,有点违反3p原则第一条。

That's all, set it all free.

  /**
 * @file 基于 Proxy & Reflect 的追踪器
 * @version 0.0.1.0
 */

/* global console */

(( win ) => {

    /**
     *
     * E.G:
     *
     *      var obj = {
     *          bar : 1,
     *          foo : ''
     *      }
     *
     *      logger(
     *          obj ,
     *          {
     *              validate: {
     *
     *                  // 类型校验
     *                  foo: [String]
     *
     *                  bar: {
     *                      // 验证器校验
     *                      validator (value) {
     *                          return value < 200;
     *                      }
     *                  }
     *              }
     *          }
     *      );
     *
     *
     *
     *
     * @param {Object} object
     * @param {Object} [options]
     * @returns {Proxy}
     */
    function logger( object, options = {} ) {
        return new Proxy( object, {
            set ( target, key, receiver ) {

                // 可扩展
                !validation( key, receiver, options.validate ) &&
                console.warn(
                    `[ 设置属性 '${key}' 的值 ${receiver} 并不符合预期 ]`
                );

                return Reflect.set( target, key, receiver );
            }

        } );
    }

    /**
     * 验证规则
     */
    function validation( key, receiver, rules ) {
        if ( !rules ) {
            return true;
        }

        let rule = normalize( rules[key] );

        return ( rule.validator )
            ? rule.validator( receiver ) 
            : rule.type.some( ( i ) => Object( receiver ) instanceof i );
    }

    /**
     * 常规化单向规则
     */
    function normalize( rule ) {
        return $type( rule ) === 'array' ? rule = {
            type: rule
        } : rule;
    }

    /**
     * tool: 获取一个对象的原始类型
     */
    function $type( object ) {
        return Reflect.toString.call( object ).replace( /\[\object|\]|\s/gi, '' ).toLowerCase()
    }

    // Install
    win.logger = logger;

})( window );

你可能感兴趣的:(基于 Proxy & Reflect 的追踪器)