@@ -8,10 +8,14 @@ const AccessControlIdentifier = {};
8
8
const ObservableIdentifier = { } ;
9
9
10
10
function setupAccessControl ( target : AnyObject ) {
11
- if ( ! isObject ( target ) ) {
11
+ if ( ! isObject ( target ) || isWrapper ( target ) ) {
12
12
return ;
13
13
}
14
- if ( hasOwn ( target , AccessControIdentifierlKey ) && target . __ac__ === AccessControlIdentifier ) {
14
+
15
+ if (
16
+ hasOwn ( target , AccessControIdentifierlKey ) &&
17
+ target [ AccessControIdentifierlKey ] === AccessControlIdentifier
18
+ ) {
15
19
return ;
16
20
}
17
21
@@ -22,57 +26,62 @@ function setupAccessControl(target: AnyObject) {
22
26
}
23
27
}
24
28
9E88
code>
25
- function defineAccessControl ( target : AnyObject , key : any ) {
29
+ /**
30
+ * Auto unwrapping when acccess property
31
+ */
32
+ export function defineAccessControl ( target : AnyObject , key : any , val ?: any ) {
33
+ let getter : ( ( ) => any ) | undefined ;
34
+ let setter : ( ( x : any ) => void ) | undefined ;
26
35
const property = Object . getOwnPropertyDescriptor ( target , key ) ;
27
- if ( ! property ) {
28
- return ;
29
- }
30
-
31
- if ( property . configurable === false ) {
32
- return ;
36
+ if ( property ) {
37
+ if ( property . configurable === false ) {
38
+ return ;
39
+ }
40
+ getter = property . get ;
41
+ setter = property . set ;
42
+ val = target [ key ] ;
33
43
}
34
44
35
- let rawVal = target [ key ] ;
36
- let isValueWrapper = isWrapper ( rawVal ) ;
37
-
38
F438
td>
- // we are sure that get and set exist.
39
- const getter = property . get ! ;
40
- const setter = property . set ! ;
41
-
42
- setupAccessControl ( target [ key ] ) ;
45
+ setupAccessControl ( val ) ;
43
46
Object . defineProperty ( target , key , {
44
47
enumerable : true ,
45
48
configurable : true ,
46
49
get : function getterHandler ( ) {
47
- if ( isValueWrapper ) {
48
- return rawVal . value ;
50
+ const value = getter ? getter . call ( target ) : val ;
51
+ if ( isWrapper ( value ) ) {
52
+ return value . value ;
49
53
} else {
50
- return getter . call ( target ) ;
54
+ return value ;
51
55
}
52
56
} ,
53
57
set : function setterHandler ( newVal ) {
54
- if ( isValueWrapper ) {
55
- rawVal . value = newVal ;
56
- setupAccessControl ( newVal ) ;
57
- return ;
58
- }
58
+ if ( getter && ! setter ) return ;
59
59
60
- if ( isWrapper ( newVal ) ) {
61
- isValueWrapper = true ;
62
- rawVal = newVal ;
63
- // trigger observer
60
+ const value = getter ? getter . call ( target ) : val ;
61
+ if ( isWrapper ( value ) ) {
62
+ if ( isWrapper ( newVal ) ) {
63
+ val = newVal ;
64
+ } else {
65
+ value . value = newVal ;
66
+ }
67
+ } else if ( setter ) {
64
68
setter . call ( target , newVal ) ;
65
- return ;
69
+ } else if ( isWrapper ( newVal ) ) {
70
+ val = newVal ;
66
71
}
67
-
68
- setter . call ( target , newVal ) ;
69
72
setupAccessControl ( newVal ) ;
70
73
} ,
71
74
} ) ;
72
75
}
73
76
77
+ export function isObservable ( obj : any ) : boolean {
78
+ return (
79
+ hasOwn ( obj , ObservableIdentifierKey ) && obj [ ObservableIdentifierKey ] === ObservableIdentifier
80
+ ) ;
81
+ }
82
+
74
83
export function observable < T = any > ( obj : T ) : T {
75
- if ( ! isObject ( obj ) ) {
84
+ if ( ! isObject ( obj ) || isObservable ( obj ) ) {
76
85
return obj ;
77
86
}
78
87
0 commit comments