ES6 학습 노트 11 Reflect
Reflect 객체 설계 목적
(1) Object 대상의 언어 내부에 뚜렷하게 속하는 방법(예를 들어
Object.defineProperty
)을 Reflect 대상에 놓는다.(2) 일부 Object 메서드를 수정하여 결과를 반환합니다.예를 들어
Object.defineProperty(obj, name, desc)
속성을 정의할 수 없을 때 오류가 발생하고 Reflect.defineProperty(obj, name, desc)
는false로 돌아갑니다.(3) Object 작업을 함수 비헤이비어로 만듭니다.예를 들어 원래
key in obj
와 delete obj[key]
, Reflect.hasProperty(obj,key)
와 Reflect.deleteProperty(obj,key)
를 함수로 바꾸다(4) Reflect 대상의 방법은 Proxy 대상의 방법과 일일이 대응하고 Proxy 대상의 방법이라면 Reflect 대상에서 대응하는 방법을 찾을 수 있다.Proxy가 기본 행동을 어떻게 수정하든지 간에, Reflect에서 기본 행동을 가져올 수 있습니다.
Proxy(target, {
set: function(target, name, value, receiver) {
var success = Reflect.set(target,name, value, receiver);
if (success) {
log('property ' + name + ' on ' + target + ' set to ' + value);
}
return success;
}
});
상기 코드는 대상의 속성 설정 조작을 차단하였으나, 내부에서 기본 속성 복사 행위를 호출하였다
정적 방법
Reflect 객체의 대부분 메서드는 Object 객체와 동일한 메서드 역할을 하며 Proxy 객체 메서드와 일치합니다.
Reflect.apply(target, thisArg, args)
: 이 방법은function과 같다.prototype.apply.call(func, thisArg, args) function.prototype.apply.call(func, thisArg, args);
//
(FuncApply).call(func,thisArg,args);
//
func.FuncApply(thisArg,args);
//
func.apply(thisArg,args);
//
thisArgs.func(args);
// func.apply(thisArg,args) , apply
Reflect.construct(target, args)
: 이 방법은 new target(...args)Reflect.get(target, name, receiver)
: target 대상의name 속성을 찾고 되돌려줍니다. 함수에서this귀속receiver 인자//this receiver
var myObject = {
foo: 1,
bar: 2,
get baz() {
return this.foo + this.bar;
},
};
var myReceiverObject = {
foo: 4,
bar: 4,
};
Reflect.get(myObject, 'baz', myReceiverObject) // 8
Reflect.set(target, name, value, receiver)
: target 대상의name 속성 값을value로 설정하고 함수에서this가receiver 파라미터를 연결하면 이 방법의 호출은Proxy를 촉발합니다.defineProperty 차단Reflect.defineProperty(target, name, desc)
: Object와 같습니다.defineProperty, 첫 번째 파라미터가 대상이 아니면 오류 Reflect.deleteProperty(target, name)
: delete obj[name]와 같이 대상 속성을 삭제하고trueReflect.has(target, name)
: 키 in obj에 대응하는 in 연산자, 첫 번째 파라미터가 대상이 아니면 오류 보고Reflect.ownKeys(target)
: Object와 같은 객체 자체의 모든 속성을 반환합니다.getOwnPropertyNames 및 Object.getOwnPropertySymbols의 합Reflect.isExtensible(target)
: Object에 해당.isExtensible (target), 첫 번째 파라미터가 대상이 아니면 오류 Reflect.preventExtensions(target)
: Object에 해당.preventExtensions (target), 대상을 확장할 수 없습니다. 파라미터가 대상이 아니라면 오류 Reflect.getOwnPropertyDescriptor(target, name)
: Object와 같습니다.getOwnPropertyDescriptor, 첫 번째 파라미터가 대상이 아니면 오류 Reflect.getPrototypeOf(target)
: 읽기 대상의 원형 대상.Object.getPrototypeOf(target)의 차이점은 파라미터가 대상이 아니라면 후자는 먼저 대상으로 전환되고 전자는 오류Reflect.setPrototypeOf(target, prototype)
: 설정 대상의 원형 대상.만약 첫 번째 파라미터가 대상이 아니거나null,undefined라면 직접 오류 보고const person = observable({
name: ' ',
age: 20
});
function print() {
console.log(`${person.name}, ${person.age}`)
}
observe(print);
person.name = ' ';
//
// , 20
const queuedObservers = new Set();
const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, {set});
function set(target, key, value, receiver) {
const result = Reflect.set(target, key, value, receiver);
queuedObservers.forEach(observer => observer());
return result;
}
상기 코드는 모든 관찰자 함수를 집합에 넣은 다음에 대상의 속성 부여 조작을 차단하고 속성이 바뀌면 모든 관찰자 함수를 자동으로 실행한다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.