2016-12-01 1 views
1

프록시를 사용하여 동적 구성 불가능 속성을 만들고 싶습니다.프록시를 사용하여 동적 구성 할 수없는 속성 만들기

const proxy = new Proxy({}, { 
 
    getOwnPropertyDescriptor() { 
 
    return { 
 
     configurable: false, 
 
     enumerable: false, 
 
    }; 
 
    }, 
 
}); 
 

 
console.log(Reflect.getOwnPropertyDescriptor(proxy, 'test'));

하지만 오류 받고 있어요 : :하지만 무엇을 설명하지 않습니다

A property cannot be reported as non-configurable, if it does not exists as an own property of the target object or if it exists as a configurable own property of the target object.

:

TypeError: 'getOwnPropertyDescriptor' on proxy: trap reported non-configurability for property 'test' which is either non-existant or configurable in the proxy target

MDN가 있다고 나는이 시도 이것 뒤에 이유.

이 오류에 대한 대안이 있습니까?

답변

7

아니요. 이는 객체에서 구성 할 수없는 속성을 관찰하면 마술처럼 사라지지 않을 수없는 바람직한 불변량 때문입니다. 또한 쓰기가 가능하지 않은 경우 값을 변경해서는 안됩니다.

당신이 이것을 의지 할 수 없으면, getOwnPropertyDescriptor는 기본적으로 쓸모가 없을 것입니다.

구성 할 수없는 속성을 사용하지 않거나 대상에서 정의하지 않으면이 불변 조건을 위반하지 않는다는 것을 의미합니다. 불변 조건은 구성에 따라 대상을 유지하기 때문입니다. 즉, ECMAScript는 이러한 불변성을 깨뜨리는 방식으로 프록시 사용자 정의를 사용할 수 없습니다.

Some of the internal method invariants defined in 6.1.7.3 are essential integrity invariants. These invariants are explicitly enforced by the proxy object internal methods specified in this section. An ECMAScript implementation must be robust in the presence of all possible invariant violations.

따라서 속성을 구성 가능으로보고하거나 대상에서 구성 할 수없는 속성을 정의하십시오.

동적 속성을 원한다면 속성을 구성 할 수 있다고 말하면 좋습니다. 그런 다음 트랩을 추가하여 false을 반환하면 재정의를 효과적으로 방지 할 수 있습니다.

+0

위대한 설명, 고마워. 내 해결책에 대해 어떻게 생각하니? 내가 생각하지 못한 부작용이 있습니까? –

+0

@ 고토 예, 올바르게 작동합니다. 다른 프록시 나 확장 불가능한 객체와 같은 좀 더 일반적인 목표에 문제가있을 수 있지만'{}'를 사용하고 다른 코드에 노출시키지 않으면 문제가 발생하지 않습니다. – Oriol

0

getOwnPropertyDescriptor 트랩 내에서 설명자를 반환하기 전에 대상 객체에 해당 속성을 정의하면 트랩이 제대로 작동하는 것 같습니다.

const proxy = new Proxy({}, { 
 
    getOwnPropertyDescriptor(target, property) { 
 
    const descriptor = { 
 
     configurable: false, 
 
     enumerable: false, 
 
    }; 
 
    Reflect.defineProperty(target, property, descriptor); 
 
    return descriptor; 
 
    }, 
 
}); 
 

 
console.log(Reflect.getOwnPropertyDescriptor(proxy, 'test'));

부작용이 (명백하게) 예를 들어 나중에 존재로보고 할 수 있음을 의미합니다 (비 구성 때문에) 삭제할 수 없습니다 생성 된 속성입니다 ,하지만 제 경우에는 중요하지 않습니다.

관련 문제