2017-03-22 6 views
1

MDN 문서과 같이, 초기화 후 클래스에 어떤 변화를 방지하여 불변 클래스를 만들기위한 솔루션으로 Object.freeze() :불변의 경우 Object.defineProperty와 Object.freeze를 사용하는 것의 차이점은 무엇입니까?

class ExampleA { 
    constructor(x) { 
     this.x = x; 
     Object.freeze(this); 
    } 
} 

그러나, 내가 본 다른 사람들과 같이 Object.defineProperty()를 사용하면 동일한 결과를 얻을 : 두 가지가 같은 일을 달성처럼 언뜻

class ExampleB { 
    constructor(x) { 
     Object.defineProperty(this, "x", {value: x}); 
    } 
} 

는, 그 내가 this.x는 불변하려는되고 있습니다 보인다. 게다가 Object.defineProperty()을 사용하면 Object.freeze()처럼 모든 것을 불변으로 만드는 대신 불변으로 만들 속성을 선택할 수 있습니다.

그래서 저는 변함없는 성취라는 측면에서 선호되는 방법은 무엇입니까? 이상으로 Object.defineProperty()을 사용하여 놓친 부작용이 있습니까?

+0

글쎄, 가장 명백한 것은 Object.defineProperty()를 사용하면 Object.freeze()와 같이 모든 것을 불변으로 만들지 않고 불변으로 만들 속성을 선택할 수 있다는 것입니다. " 또한'Object.defineProperty()'는 유용 할 수있는 다른 것들을 할 수 있습니다. (그런데, 그 속성이 다른 객체를 참조하는 경우에도 객체를 고정시킨 후에도 그 객체는 고정되어 있지 않으면 변경 될 수 있음을 이해합니다.) – nnnnnn

답변

1

둘 다 완전히 다른 도구입니다. Object.freezeObject 수준에서 얕게 작동하지만 Object.defineProperty은 속성 수준에서 작동합니다. 둘 다 오브젝트 유형의 변경 가능성을 제어 할 수 있지만 후자는 오브젝트 유형의 변경 가능성을 제어 할 수 있습니다. 즉, 속성에 다른 객체 유형이 포함되어있는 경우이 객체는 Object.freeze이나 Object.defineProperty의 영향을받지 않지만 변경할 수 있음을 의미합니다.

두 도구 모두 변경 불가능하고 깊은 불변성이 높기 때문에 불변성을 명시 적으로 적용하는 것이 아니라 정책으로 간주하는 것이 좋습니다.