Programing

동결과 밀봉의 차이점

crosscheck 2020. 6. 16. 08:21
반응형

동결과 밀봉의 차이점


방금 JavaScript 메소드 freeze에 대해 들었습니다.이 메소드를 seal사용하면 모든 Object를 변경할 수 없습니다.

사용 방법에 대한 간단한 예는 다음과 같습니다.

var o1 = {}, o2 = {};
Object.freeze(o2);

o1["a"] = "worked";
o2["a"] = "worked";

alert(o1["a"]);   //prints "worked"
alert(o2["a"]);   //prints "undefined"

차이점은 무엇이며 freeze그리고 seal? 성능을 향상시킬 수 있습니까?


Object.seal

  • 밀봉 된 물체로부터 특성을 추가 및 / 또는 제거하는 것을 방지한다; 를 사용 delete하면 false가 반환됩니다.
  • 기존의 모든 속성 을 구성 할 수 없습니다. '데이터 디스크립터'에서 '액세서 디스크립터'로 (또는 그 반대로) 변환 할 수 없으며, 데이터 디스크립터가 writable속성을 변경할 수있는 반면, 액세서 디스크립터의 속성은 전혀 수정할 수 없습니다. 해당되는 value경우 해당 속성 writeable).
  • TypeError봉인 된 객체 자체의 값을 수정하려고 할 때 (가장 일반적으로 엄격 모드 )를 던질 수 있습니다

Object.freeze

  • 정확히 무엇을 Object.seal하고 플러스 :
  • 기존 속성을 수정 하지 못합니다.

둘 다 '깊은'/ 손자 개체에는 영향을 미치지 않습니다. 예를 들어, obj고정 된 경우 obj.el재 할당 할 수 없지만 값을 obj.el수정할 obj.el.id수 있습니다 ( 예 : 변경 가능).


공연:

브라우저에 따라 개체를 봉인하거나 고정하면 열거 속도에 영향을 줄 수 있습니다.

  • Firefox : 열거 성능에 영향을 미치지 않습니다
  • IE : 열거 성능 영향은 무시할 수 있습니다.
  • Chrome : 봉인 또는 고정 된 개체로 열거 성능이 더 빠릅니다.
  • Safari : 봉인 또는 고정 된 개체가 92 % 느리게 열거 됨 (2014 년 기준)

테스트 : 밀폐 된 객체 , 고정 된 객체 .


이 세 가지 방법을 비교 하는 테스트 프로젝트작성했습니다 .

  • Object.freeze()
  • Object.seal()
  • Object.preventExtensions()

내 단위 테스트는 CRUD 사례를 다룹니다.

  • [C] 새로운 속성 추가
  • [R] 기존 속성 읽기
  • [U] 기존 속성 수정
  • [D] 기존 속성 제거

결과:

여기에 이미지 설명을 입력하십시오


당신은 항상 MDN에서 이것들을 찾을 수 있습니다. 한마디로 :

  • 고정 : 객체를 변경할 수 없게합니다. 즉 객체가 아닌 한 정의 된 속성을 변경할 수 없습니다.
  • 봉인 : 속성 추가를 방지하지만 정의 된 속성을 여전히 변경할 수 있습니다.

Object.freeze()고정 된 개체를 만듭니다. 즉, 기존 개체를 가져 와서 기본적으로 개체를 호출 Object.seal()하지만 writable:false값을 변경할 수 없도록 모든 "데이터 접근 자"속성도로 표시합니다 . -Kyle Simpson, 당신은 JS를 모른다-이것 & 객체 프로토 타입


ECMAScript 5에서 Freeze와 Seal의 차이점을 살펴보고 차이점을 명확하게하는 스크립트를 만들었습니다. 고정은 데이터 및 구조를 포함하여 변경 불가능한 객체를 만듭니다. Seal은 명명 된 인터페이스의 변경을 방지합니다 (추가, 삭제 없음). 그러나 객체를 변경하고 인터페이스의 의미를 재정의 할 수 있습니다.

function run()
{
    var myObject = function() 
    { 
        this.test = "testing"; 
    }

    //***************************SETUP****************************

    var frozenObj = new myObject();
    var sealedObj = new myObject();

    var allFrozen = Object.freeze(frozenObj);
    var allSealed = Object.seal(sealedObj);
    alert("frozenObj of myObject type now frozen - Property test= " + frozenObj.test);
    alert("sealedObj of myObject type now frozen - Property test= " + sealedObj.test);

    //***************************FROZEN****************************

    frozenObj.addedProperty = "added Property"; //ignores add
    alert("Frozen addedProperty= " + frozenObj.addedProperty);
    delete frozenObj.test; //ignores delete
    alert("Frozen so deleted property still exists= " + frozenObj.test);
    frozenObj.test = "Howdy"; //ignores update
    alert("Frozen ignores update to value= " + frozenObj.test);
    frozenObj.test = function() { return "function"; } //ignores
    alert("Frozen so ignores redefinition of value= " + frozenObj.test);

    alert("Is frozen " + Object.isFrozen(frozenObj));
    alert("Is sealed " + Object.isSealed(frozenObj));
    alert("Is extensible " + Object.isExtensible(frozenObj));

    alert("Cannot unfreeze");
    alert("result of freeze same as the original object: " + (frozenObj === allFrozen).toString());

    alert("Date.now = " + Date.now());

    //***************************SEALED****************************

    sealedObj.addedProperty = "added Property"; //ignores add
    alert("Sealed addedProperty= " + sealedObj.addedProperty);
    sealedObj.test = "Howdy"; //allows update
    alert("Sealed allows update to value unlike frozen= " + sealedObj.test);
    sealedObj.test = function() { return "function"; } //allows
    alert("Sealed allows redefinition of value unlike frozen= " + sealedObj.test);
    delete sealedObj.test; //ignores delete
    alert("Sealed so deleted property still exists= " + sealedObj.test);
    alert("Is frozen " + Object.isFrozen(sealedObj));
    alert("Is sealed " + Object.isSealed(sealedObj));
    alert("Is extensible " + Object.isExtensible(sealedObj));

    alert("Cannot unseal");
    alert("result of seal same as the original object: " + (sealedObj === allSealed).toString());

    alert("Date.now = " + Date.now());
}

조금 늦을 수도 있지만

  • 유사성 : 둘 다 확장 불가능한 객체 를 만드는 데 사용 됩니다 .
  • 차이점 : Freeze 구성 가능 에서 개체의 열거 가능하고 쓰기 가능 특성이로 설정되어 false있습니다. 봉인 된 쓰기 가능 속성에서로 설정 true되고 나머지 속성은 false입니다.

이제 전체 객체를 고정하는 대신 단일 객체 속성을 강제로 고정 할 수 있습니다. 당신이 이것을 달성 할 수 Object.definePropertywritable: false매개 변수로.

var obj = {
    "first": 1,
    "second": 2,
    "third": 3
};
Object.defineProperty(obj, "first", {
    writable: false,
    value: 99
});

이 예에서는 obj.first이제 값이 99로 잠겨 있습니다.

참고 URL : https://stackoverflow.com/questions/21402108/difference-between-freeze-and-seal

반응형