2013-12-08 2 views
1

배열을 ES5 스타일 개체의 속성으로 정의 할 때 속성 값을 변경할 수 없도록 설정하려고합니다.ES5 변경 불가능한 배열/속성 값 정의

'use strict'; 

var global = Object.create(Object.prototype, { 
    names: { 
     value: ['Barney', 'Trogdor'], 
     writable: false 
    } 
}); 

global.names.push('Jackson'); // I expected a read-only error here 

console.log(global.names[2]); // >> Jackson 

global.names = ['Ooga', 'Booga']; // >> TypeError: "names" is read-only 

속성 할당에 대해서만 보호 한 것으로 보입니다.

내 "쓸 수없는"배열을 수정하는 Array.push() 같은 것을 방지 할 수있는 방법이 있습니까? 당신이 무엇을 푸시 방법을 덮어 쓰지 왜 모든 데이터가로드되면

답변

-2

:

global.names.push = function() {return false} 
+1

나는 또한 .splice() 등을 덮어 써야합니다. 이것은 바람직하지 않은 해결책입니다. – Jackson

+0

사실,하지만 Object.seal(), 위대한 솔루션, [IE와 관련하여] 버전 9 +에만 적용됩니다 나는 이것에 대한 적절한 해결책을 알고 싶습니다. 아마도이 방법이 지원되지 않는 대체 방법은 해당 메소드를 덮어 쓰거나 배열에 대한 읽기 전용 액세스 만 제공하는 것입니다. –

+0

IE5 +를 암시하는 ES5의 맥락에서이 질문을하고있었습니다. 나는'Object.seal()'을 대체 할 필요가 없다. 사실'.seal()'은'쓰기 가능 : false '가 존재한다는 것을 감안할 때 나에게별로 의미가 없다고 느낍니다. – Jackson

3

Object.seal()가 작동하는 것 같다.


편집

'use strict'; var global = Object.create(Object.prototype, { names: { value: Object.seal(['Barney', 'Trogdor']) } }); global.names.push('Jackson'); // >> TypeError: global.names.push(...) is not extensible 

:
사실, 신경 끄시 고. 내가 Object.freeze()이 실제로 원하는 것을이었다 생각

global.names[0] = 'Jackson'; // Still works 

: 앞의 예에서

, 나는 다음 코드 줄을 추가했다.

var global = Object.create(Object.prototype, { 
    names: { value: Object.freeze(['Barney', 'Trogdor']) } 
}); 
global.names.push('Jackson'); // >> TypeError: global.names.push(...) is not extensible 
global.names[0] = 'Jackson'; // >> TypeError: 0 is read-only 
global.names = ['Jackson']; // >> TypeError: "names" is read-only 
+0

나는'Object.create'가 불필요하다고 믿습니다.'var global = {names : Object.freeze ([Barney ','Trogdor '])}'충분해야합니다. –

+0

Nope. 'names' 프라퍼티를'Object.create()'로 정의하면 속성은 암시 적으로'쓰기 가능 : false'입니다 (명확하게하기 위해 명확하게 제 질문 코드에 명시했습니다). 객체 리터럴 구문을 사용하면이 속성은'쓰기 가능 '이됩니다. 그럼에도 불구하고 어쨌든 "글로벌"에 더 많은 속성을 추가 할 계획이었습니다. – Jackson

+0

이런 의미에서,'global.names = []'는 실패합니다. 나는 보통 당신의 대답을 +1했는데, 나는 보통 물건을 허락하는 경향이있다. 전체 대문자를 사용하여 상수를 나타내면 개발자는 이러한 속성을 수정하면 예기치 않은 결과가 발생할 수 있음을 암시 적으로 알 수 있습니다. –

관련 문제