8000 Implement ownKeys handler · HowProgrammingWorks/Transaction@efaa4a8 · GitHub
[go: up one dir, main page]

Skip to content

Commit efaa4a8

Browse files
committed
Implement ownKeys handler
1 parent 4db9f6e commit efaa4a8

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

JavaScript/5-own-keys.js

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
'use strict';
2+
3+
function Transaction() {}
4+
5+
Transaction.start = (data) => {
6+
console.log('\nstart transaction');
7+
let delta = {};
8+
9+
const methods = {
10+
commit: () => {
11+
console.log('\ncommit transaction');
12+
Object.assign(data, delta);
13+
delta = {};
14+
},
15+
rollback: () => {
16+
console.log('\nrollback transaction');
17+
delta = {};
18+
}
19+
};
20+
21+
return new Proxy(data, {
22+
get(target, key) {
23+
if (methods.hasOwnProperty(key)) return methods[key];
24+
if (delta.hasOwnProperty(key)) return delta[key];
25+
return target[key];
26+
},
27+
getOwnPropertyDescriptor: (target, key) => (
28+
Object.getOwnPropertyDescriptor(
29+
delta.hasOwnProperty(key) ? delta : target, key
30+
)
31+
),
32+
33+
// Added handler
34+
ownKeys() {
35+
const changes = Object.keys(delta);
36+
const keys = Object.keys(data).concat(changes);
37+
return keys.filter((x, i, a) => a.indexOf(x) === i);
38+
},
39+
40+
set(target, key, val) {
41+
console.log('set', key, val);
42+
if (target[key] === val) delete delta[key];
43+
else delta[key] = val;
44+
return true;
45+
}
46+
});
47+
};
48+
49+
// Usage
50+
51+
const data = { name: 'Marcus Aurelius', born: 121 };
52+
53+
const transaction = Transaction.start(data);
54+
console.log('data', JSON.stringify(data));
55+
console.log('transaction', JSON.stringify(transaction));
56+
57+
transaction.name = 'Mao Zedong';
58+
transaction.born = 1893;
59+
transaction.city = 'Shaoshan';
60+
61+
console.log('\noutput with JSON.stringify:');
62+
console.log('data', JSON.stringify(data));
63+
console.log('transaction', JSON.stringify(transaction));
64+
65+
console.log('\noutput with console.dir:');
66+
console.dir({ transaction });
67+
68+
console.log('\noutput with for-in:');
69+
for (const key in transaction) {
70+
console.log(key, transaction[key]);
71+
}
72+
73+
transaction.commit();
74+
console.log('data', JSON.stringify(data));
75+
console.log('transaction', JSON.stringify(transaction));

0 commit comments

Comments
 (0)
0