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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy