동결과 밀봉의 차이점
방금 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
? 성능을 향상시킬 수 있습니까?
- 밀봉 된 물체로부터 특성을 추가 및 / 또는 제거하는 것을 방지한다; 를 사용
delete
하면 false가 반환됩니다. - 기존의 모든 속성 을 구성 할 수 없습니다. '데이터 디스크립터'에서 '액세서 디스크립터'로 (또는 그 반대로) 변환 할 수 없으며, 데이터 디스크립터가
writable
속성을 변경할 수있는 반면, 액세서 디스크립터의 속성은 전혀 수정할 수 없습니다. 해당되는value
경우 해당 속성writeable
). TypeError
봉인 된 객체 자체의 값을 수정하려고 할 때 (가장 일반적으로 엄격 모드 )를 던질 수 있습니다
- 정확히 무엇을
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.defineProperty
와 writable: 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
'Programing' 카테고리의 다른 글
Java에서 다중 상속이없는 이유는 있지만 여러 인터페이스를 구현할 수 있습니까? (0) | 2020.06.16 |
---|---|
UIViewContentModeScaleAspectFill이 클리핑되지 않음 (0) | 2020.06.16 |
onCreate ()와 onStart ()의 차이점은 무엇입니까? (0) | 2020.06.16 |
빈 쿼리 인 경우 최대 반환 값 (0) | 2020.06.16 |
SSL 오류 : npm 명령을 사용하는 동안 CERT_UNTRUSTED (0) | 2020.06.16 |