1、proxy
let dictionary = {
'Hello': 'Hola',
'Bye': 'Adiós'
};
dictionary = new Proxy(dictionary, {
get(target, phrase) {
if (phrase in target) {
return target[phrase];
} else {
return phrase;
}
}
});
alert( dictionary['Hello'] );
alert( dictionary['Welcome to Proxy']);
2、Reflect.get
const negativeArray = els =>
new Proxy(els, {
get: (target, propKey, receiver) =>
Reflect.get(
target,
+propKey < 0 ? String(target.length + +propKey) : propKey,
receiver
)
});
debugger
const unicorn = negativeArray(["京", "程", "一", "灯"]);
debugger
unicorn[-1];
const negativeArray = els =>
new Proxy(els, {
get: (target, propKey, receiver) =>{
if(+propKey < 0 ){
return target[String(target.length + +propKey)]
}else{
return target[propKey]
}
}
})
debugger
const unicorn = negativeArray(["京", "程", "一", "灯"])
debugger
unicorn[-1]
unicorn[3]
2、get + set +deleteProperty
let user = {
name: "John",
_password: "***"
};
user = new Proxy(user, {
get(target, prop) {
if (prop.startsWith('_')) {
throw new Error("Access denied");
}
let value = target[prop];
return (typeof value === 'function') ? value.bind(target) : value;
},
set(target, prop, val) {
if (prop.startsWith('_')) {
throw new Error("Access denied");
} else {
target[prop] = val;
return true;
}
},
deleteProperty(target, prop) {
if (prop.startsWith('_')) {
throw new Error("Access denied");
} else {
delete target[prop];
return true;
}
},
ownKeys(target) {
return Object.keys(target).filter(key => !key.startsWith('_'));
}
});
debugger
try {
alert(user._password);
} catch(e) { alert(e.message); }
try {
user._password = "test";
} catch(e) { alert(e.message); }
try {
delete user._password;
} catch(e) { alert(e.message); }
for(let key in user) alert(key);
javascript.info/proxy