Skip to content

Commit 030efe8

Browse files
committed
Simple proxy
1 parent 555e40e commit 030efe8

File tree

1 file changed

+23
-38
lines changed

1 file changed

+23
-38
lines changed

JavaScript/1-proxy.js

Lines changed: 23 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,51 @@
11
'use strict';
22

3-
function Transaction() {}
4-
5-
Transaction.start = (data) => {
3+
const start = (data) => {
64
console.log('start transaction');
75
let delta = {};
8-
9-
const methods = {
10-
commit: () => {
11-
console.log('commit transaction');
12-
Object.assign(data, delta);
13-
delta = {};
14-
},
15-
rollback: () => {
16-
console.log('rollback transaction');
17-
delta = {};
18-
}
19-
};
20-
21-
const proxy = new Proxy(data, {
22-
get(target, key, proxy) {
23-
if (key === Symbol.iterator) {
24-
const changes = Object.keys(delta);
25-
const keys = Object.keys(target).concat(changes);
26-
const props = keys.filter((x, i, a) => a.indexOf(x) === i);
27-
return props[Symbol.iterator]();
6+
return new Proxy(data, {
7+
get(target, key) {
8+
if (key === 'commit') {
9+
return () => {
10+
console.log('commit transaction');
11+
Object.assign(data, delta);
12+
delta = {};
13+
};
2814
}
29-
if (methods.hasOwnProperty(key)) return methods[key];
3015
if (delta.hasOwnProperty(key)) return delta[key];
3116
return target[key];
3217
},
33-
getOwnPropertyDescriptor: (target, key) => (
34-
Object.getOwnPropertyDescriptor(
35-
delta.hasOwnProperty(key) ? delta : target, key
36-
)
37-
),
3818
set(target, key, val) {
3919
console.log('set', key, val);
4020
if (target[key] === val) delete delta[key];
4121
else delta[key] = val;
4222
return true;
4323
}
4424
});
45-
return proxy;
4625
};
4726

4827
// Usage
4928

5029
const data = { name: 'Marcus Aurelius', city: 'Rome', born: 121 };
5130

52-
const transaction = Transaction.start(data);
53-
console.dir(transaction);
31+
console.log('data.name', data.name);
32+
console.log('data.born', data.born);
33+
34+
const transaction = start(data);
5435

5536
transaction.name = 'Mao Zedong';
5637
transaction.born = 1893;
57-
console.dir({ data, transaction });
38+
39+
console.log('data.name', data.name);
40+
console.log('data.born', data.born);
41+
42+
console.log('transaction.name', transaction.name);
43+
console.log('transaction.born', transaction.born);
5844

5945
transaction.commit();
60-
console.dir({ data, transaction });
6146

62-
transaction.city = 'Shaoshan';
63-
console.dir({ data, transaction });
47+
console.log('data.name', data.name);
48+
console.log('data.born', data.born);
6449

65-
transaction.rollback();
66-
console.dir({ data, transaction });
50+
console.log('transaction.name', transaction.name);
51+
console.log('transaction.born', transaction.born);

0 commit comments

Comments
 (0)