12.2.1
var pipe = (function() {
return function(value) {
var funcStack = [];
var oproxy = new Proxy({}, {
get: function (pipeObject, fnName) {
if(fnName === 'get') {
return funcStack.reduce((val, fn) => {
console.log(fn);
return fn(val);
}, value);
}
console.log(funcStack);
funcStack.push(window[fnName]);
return oproxy;
}
});
return oproxy;
}
}());
var double = n => n*2;
var pow = n => n*n;
var reverseInt = n => n.toString().split("").reverse().join("") | 0;
pipe(3).double.pow.reverseInt.get;
const dom = new Proxy({}, {
get(target, property) {
return function(attrs = {}, ...children) {
const e1 = document.createElement(property);
for(let prop of Object.keys(attrs)) {
e1.setAttribute(prop, attrs[prop]);
}
for(let child of children) {
if(typeof child === "string") {
child = document.createTextNode(child);
}
e1.appendChild(child);
}
return e1;
}
}
});
const e1 = dom.div({},
'hello, my name is',
dom.a({href: '//exmaple.com'}, 'Mark'),
'. I like: ',
dom.u1({},
dom.li({}, 'The web'),
dom.li({}, 'Food'),
dom.li({}, '...actually that\'s it')
)
);
document.body.appendChild(e1);
12.2.2
let validator = {
set: function(obj, prop, value) {
if(prop === 'age') {
if(!Number.isInteger(value)) {
throw new TypeError('The age is not an integer');
}
if(value > 200) {
throw new RangeError('The age seems invalid');
}
}
obj[prop] = value;
}
}
let person = new Proxy({}, validator);
person.age = 100;
person.age
person.age = 'young'
person.age = 300
var handler = {
get(target, key) {
invariant(key, 'get');
return target[key];
},
set(target, key, value) {
invariant(key, 'set');
target[key] = value;
return true;
}
}
function invariant(key, action) {
if(key[0] === '_') {
throw new Error(`Invalid attempt to ${action} privat "${key}" property`);
}
}
var target = {};
var proxy = new Proxy(target, handler);
proxy._prop;
proxy._prop = 'c'
12.2.3
var target = function() {
return 'i am the target';
}
var handler = {
apply: function() {
return 'I am the proxy';
}
}
var p = new Proxy(target, handler);
p()
var twice = {
apply: function(target, ctx, args) {
return Reflect.apply(...arguments) * 2;
}
}
function sum(left, right) {
return left + right;
}
var proxy = new Proxy(sum, twice);
proxy(1, 2);
proxy.call(null, 5, 6)
proxy.apply(null, [7, 8])
12.2.4
var handler = {
has: function (target, key) {
if(key[0] === '_') {
return false;
}
return key in target;
}
}
var target = {_prop: 'foo', prop: 'foo'};
var proxy = new Proxy(target, handler);
'_prop' in proxy;