今天又看到 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 );