1+ /**
2+ * 将一个对象转化为可观测对象
3+ * @param { Object } obj 对象
4+ * @param { String } key 对象的key
5+ * @param { Any } val 对象的某个key的值
6+ */
7+ const defineReactive = ( obj : Object , key : string , val : any ) : void => {
8+ Object . defineProperty ( obj , key , {
9+ enumerable : true ,
10+ configurable : true ,
11+ get ( ) {
12+ return val ;
13+ } ,
14+ set ( newVal ) {
15+ val = newVal ;
16+ }
17+ } )
18+ }
19+ /**
20+ * 设计一个对象的观测者
21+ * @param { Object } obj 对象
22+ * @return { Object } 返回一个可观测对象
23+ * @example let obj = observerDef({name:'alex',age:18})
24+ */
25+ export const observeDef = ( obj : Object ) : Object | undefined => {
26+ if ( ! obj || typeof obj !== 'object' ) {
27+ return ;
28+ }
29+ let keys = Object . keys ( obj ) ;
30+ keys . forEach ( key => {
31+ defineReactive ( obj , key , obj [ key as keyof typeof obj ] ) ;
32+ } )
33+ return obj ;
34+ }
35+
36+ /**
37+ * 设计一个对象的观测者 - proxy方案
38+ * @param { Object } obj 对象
39+ * @return { cal } 观测对象回调方法
40+ * @example let obj = observeProxy({name:'alex',age:18},callback)
41+ */
42+ export const observeProxy = ( obj : Object , cal : ( val : any ) => void ) => {
43+ return new Proxy ( obj , {
44+ get : function ( target , prop ) {
45+ return Reflect . get ( target , prop ) ;
46+ } ,
47+ set : function ( target , prop , val ) {
48+ cal ( val ) ;
49+ return Reflect . set ( target , prop , val ) ;
50+ } ,
51+ deleteProperty : function ( target , prop ) {
52+ return Reflect . deleteProperty ( target , prop ) ;
53+ }
54+ } )
55+ }
0 commit comments