es6 학습 노트 정리 (11) Proxy 및 Reflect
Proxy 에이전트는 사용자와 대상 사이의 가장 진실한 층을 연결하고 진실한 대상을 보이지 않습니다.사용자가 가져온 대상과 대상은 직접 조작할 수 없으며 에이전트를 거쳐야 한다.대리 차원에서 서로 다른 업무 논리에 따라 상응하는 처리를 할 수 있다.
let obj = {
time:'2018-03-09',
name:'asd',
_r:123
};
let people = new Proxy(obj,{
//
get(target, key){
return target[key].replace('2018','2019');
},
//
set(target, key, value){
// name ,target obj
if(key === 'name'){
return target[key] = value;
}else{
return target[key];
}
},
// key in object
//
has(target, key){
// name
if(key === 'name'){
return target[key];
}else{
return false;
}
},
// delete
deleteProperty(target, key){
if(key.indexOf('_') > -1){
delete target[key];
return true;
}else{
return target[key];
}
},
// Object.key, Object.getOwnPropertySymbols,Object.getOwnpropetyNames
ownKeys(target){
return Object.keys(target).filter(item=>item != 'time');
}
});
console.log('get', people.time);//2019-03-09
people.time = '2019';
console.log('set1', people.time);//2019-03-09
people.name = 'qwe';
console.log('set2', people.time, people);//2019-03-09 Proxy {time: "2018-03-09", name: "qwe", _r: 123}
console.log('has','name' in people,'time' in people);//has true false
console.log('ownKeys', Object.keys(people));//ownKeys (2) ["name", "_r"]
delete people.time;
console.log('delete',people);//delete Proxy {time: "2018-03-09", name: "qwe", _r: 123}
delete people._r;
console.log('delete',people);//delete Proxy {time: "2018-03-09", name: "qwe"}
}
Reflect의 개념 및 기본 사용
Reflect는 Proxy의 사용 방법과 마찬가지로 Proxy의 방법도 있고 Reflect도 모두 있으며 이름과 사용법도 같다.
let obj = {
time:'2018-03-09',
name:'asd',
_r:123
};
console.log('Reflect get',Reflect.get(obj, 'time'));//Reflect get 2018-03-09
Reflect.set(obj,'name','qwe');
console.log('Reflect set', obj);//Reflect set {time: "2018-03-09", name: "qwe", _r: 123}
console.log(Reflect.has(obj,'name'));//true
Proxy 및 Reflect의 해당 장면
실제 운용: 데이터 검사, 예를 들어 핸드폰 번호, 메일박스 등
function validator(target, validator){
return new Proxy(target,{
_validator:validator,
set(target,key,value,proxy){
if(target.hasOwnProperty(key)){
let va = this._validator[key];
if(!!va(value)){
return Reflect.set(target,key,value,proxy);
}else{
throw Error(` ${key} ${value}`);
}
}else{
throw Error(`${key} `);
}
}
});
}
const personValidators={
name(value){
return typeof val === 'string';
},
age(val){
return typeof val === 'number' && val>18;
}
};
class Person{
constructor(name, age){
this.name = name;
this.age = age;
return validator(this, personValidators);
}
}
const person = new Person('zhangsan', 18);
// person.name = 123;// ,
person.age = 80;
console.log(person);//Proxy {name: "zhangsan", age: 80}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.