ES6 의 Proxy,Reflect 및 Vue 3.0 의 응용 원리
17118 단어 학습 노트vue.js전단 엔지니어 가 초급 에서 고급 까지
Proxy
대신 Object.defineProperty
을 사용 해 데이터 응답 식 을 만 들 겠 다 고 밝 혔 다.Object.defineProperty
에 대해 잘 알 고 있 습 니 다.이전에 도 관련 Vue 양 방향 바 인 딩 원리(2)방문 기 속성 define Property()와 게시/구독 모드 를 쓴 적 이 있 습 니 다.우리 도
Object.defineProperty
을 사용 하 는 약점 을 알 게 되 었 다.Object.defineProperty
감청 은 대상 의 속성 이다.대상 이 비교적 복잡 하면 그의 속성 을 하나하나 심층 적 으로 옮 겨 다 니 며 감청 을 실현 해 야 한다.소모 성능 Object.defineProperty
은 배열 의 변 화 를 감청 할 수 없어 Vue 는 배열 에 추가 적 인 hack 를 할 수 밖 에 없 었 다.그 에 비해
Proxy
이 더 강하 다.그 다음 에 우 리 는 그 를 알 아 보 자.참고 자료:
프 록 시 프로필
Proxy 대상 은 기본 작업 의 사용자 정의 행동(예 를 들 어 속성 찾기,할당,매 거 진,함수 호출 등)을 정의 하 는 데 사 용 됩 니 다.사용 방법 은 다음 과 같다.
//
let p = new Proxy(target, handler);
//
let p = {a: 1};
let proxyP = new Proxy(p, {
get() {
// proxyP
},
set() {
// proxyP
}
})
위의 코드 중:
handler
:handler
자체 가 ES6 의 새로운 디자인 의 대상 이다.그 역할 은 대리 대상 을 사용자 정의 하 는 각종 대리 작업 이다.그 자체 에 모두 13 가지 방법 이 있 는데 모든 방법 이 하나의 조작 을 대리 할 수 있 고 자주 사용 하 는 몇 가지 방법 은 다음 과 같다.// , Object.defineProperty(proxy, "foo", {}) 。
handler.defineProperty()
// , "foo" in proxy 。
handler.has()
// , proxy.foo 。
handler.get()
// , proxy.foo = 1 。
handler.set()
// , delete proxy.foo 。
handler.deleteProperty()
// , Object.getOwnPropertyNames(proxy) 。
handler.ownKeys()
// , proxy() 。
handler.apply()
// , new proxy() 。
handler.construct()
프 록 시가 프 록 시 모드 프 록 시 에 대한 역할 은 주로 세 가지 측면 에 나타난다.
위 에서 이미
Object.defineProperty
의 열 세 를 말 했다.상응하는 Proxy
의 우 세 는 매우 뚜렷 하 다.프 록 시의 약점:호환성 문제 가 있 고 poly fill 로 평평 하 게 갈 수 없 기 때문에 Vue 는 3.0 버 전이 되 어야 프 록 시 로 다시 쓸 수 있 습 니 다.
간단 한 예:
const input = document.getElementById('input');
const p = document.getElementById('p');
const obj = {};
const newObj = new Proxy(obj, {
get: function(target, key, receiver) {
console.log(`getting ${key}!`);
return Reflect.get(target, key, receiver);
},
set: function(target, key, value, receiver) {
console.log(target, key, value, receiver);
if (key === 'text') {
input.value = value;
p.innerHTML = value;
}
return Reflect.set(target, key, value, receiver);
},
});
input.addEventListener('keyup', function(e) {
newObj.text = e.target.value;
});
Reflect
Reflect 는 내 장 된 대상 으로 자바 스 크 립 트 작업 을 차단 하 는 방법 을 제공 합 니 다.이 방법 들 은 프로세서 대상 의 방법 과 같다.Reflect 는 함수 대상 이 아니 기 때문에 구성 할 수 없습니다(즉,
new Reflect
).Reflect
대상 의 방법 은 Proxy
대상 의 방법 과 일일이 대응 하여 Proxy
대상 의 방법 이 라면 Reflect
대상 에서 대응 하 는 방법 을 찾 을 수 있다.이로써 Proxy
대상 이 대응 하 는 Reflect 방법 을 편리 하 게 호출 하여 기본 행 위 를 완성 하고 수정 행위 의 기초 로 삼 을 수 있다.즉,Proxy
이 기본 행 위 를 어떻게 수정 하 든 Reflect
에서 기본 행 위 를 얻 을 수 있다 는 것 이다.즉,Reflect.fn 은 handler 의 fn 의 기본 행동 을 나타 낸다.
여기 서 우 리 는 두 단락 의 코드 를 본다.
// get/set log ,
var obj = new Proxy({}, {
get: function (target, key, receiver) {
console.log(`getting ${key}!`);
// console ,get
// Reflect.get , , undefined
return Reflect.get(target, key, receiver);
},
set: function (target, key, value, receiver) {
console.log(`setting ${key}!`);
return Reflect.set(target, key, value, receiver);
}
});
// set ,set log,
var obj = new Proxy({}, {
set: function(target, name, value, receiver) {
var success = Reflect.set(target,name, value, receiver);
if (success) {
console.log('property ' + name + ' on ' + target + ' set to ' + value);
}
return success;
}
});
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
STL 학습노트(6) 함수 객체모방 함수는 모두pass-by-value이다 함수 대상은 값에 따라 전달되고 값에 따라 되돌아오기 때문에 함수 대상은 가능한 한 작아야 한다(대상 복사 비용이 크다) 함수 f와 대상 x, x 대상에서 f를 호출하면:...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.