2014-12-13 5 views
2

내 공개 모듈 안에 다음과 같은 코드가 있지만 정확히 선언하지 않는 방법이 있습니다. 정확히 DTO이고 아무 정보도 숨길 필요가 없습니다. imageListItem을 선언/정의하는 방법이 불확실합니다. 이 개체를 올바르게 정의하고 있습니까?고정 된 구조의 객체를 만들려면 어떻게해야합니까?

var imageListItem = function() { 
    var _title; 
    Object.defineProperty(this, "title", { 
     get: function() { return _title; }, 
     set: function (value) { _title = value; } 
     } 
    ); 
}; 

var imageList = (function() { 
    var buffer = new CBuffer(); 
    return { 
     populate: function (listItems) { 
      buffer.push(listItems); 
     }, 
     rotate: function() { 
      buffer.rotateLeft(); 
     } 
    } 
})(); 

imageListItem으로 나중에 사용할 수 있도록 개체 구조를 선언하고 싶습니다. 그 선언은 논리적으로 객체가 나중에 어떻게 사용될 것인지에 의존해서는 안됩니다. 즉, 우연히 imageListItem에 새 속성을 동적으로 할당하거나 속성을 삭제하지 않는 것을보고 싶지 않습니다. 속성에 대한 모든 할당은 객체에서 이미 선언 된 속성에만 엄격하게 적용되어야합니다.

Object.freeze()은 속성이 추가되거나 제거되는 것을 막음으로써 거의 달성되지만 속성이 변경되는 것을 방지합니다.

예 :

// Now any changes will fail 
function fail(){ 
    'use strict'; 
    obj.foo = 'sparky'; // throws a TypeError 
} 

당신은 참조 :이 원하는 '해달라고

var obj = { 
    prop: function() {}, 
    foo: 'bar' 
}; 

// New properties may be added, existing properties may be changed or removed 
obj.foo = 'baz'; 
obj.lumpy = 'woof'; 

var o = Object.freeze(obj); 

// Now any changes will fail 
function fail(){ 
    'use strict'; 
    obj.delete(foo); // throws a TypeError 
    obj.quaxxor = 'the friendly duck'; // throws a TypeError 
} 

:이 원하는? freeze이 이 obj에 추가되는 것을 막으려 고합니다.하지만 foo 값을 변경하지 못하게하고 싶습니다.

+0

정보 숨기기 (또는 논리)가 필요없는 경우 왜 접근 자 속성을 사용합니까? 그냥'this.title = undefined; '를 사용하십시오. – Bergi

+0

(그 답이 찾고있는 것이 확실하지 않은 경우) – Bergi

+0

@Bergi, 아마도 가까운 것 같습니다. 방금 초기화되지 않은 변수를 선언하는 방법을 알지 못했습니다. – ProfK

답변

2

찾고있는 것은 Object.preventExtensions() 또는 Object.seal() 일 수 있습니다.

Object.freeze()과 마찬가지로 두 방법 모두 은 새 속성이 개체에 추가되는 것을 방지하지만 기존 속성의 값을 변경할 수 있습니다..

preventExtensions 실제로 삭제되는 기존의 속성을 방해하지 않는 동안 seal 엄격하게, 삭제 및/데이터의 접근에 대한 속성의 변환을 허용하지 않습니다 것을 sealpreventExtensions 사이의 차이가

:이 동작은 당신이 사용하고있는 JS 엔진에 따라 달라집니다 (일부 엔진은 속성을 삭제하도록 허용 할 수 있지만 다른 엔진은 삭제하지 않을 수 있습니다).

그래서 기본적으로 MDN 문서에서 인용 :

Object.preventExtensions() 방법은 이제까지 객체에 추가되는 새로운 속성을 방지합니다 (즉 객체에 미래의 확장을 방지). [...] 일반적으로 확장 할 수없는 개체의 속성은 여전히 ​​이 삭제 된 것일 수 있습니다..

Object.seal() 메서드는 객체를 봉인하여 새 속성이 추가되지 못하도록하고 기존의 모든 속성을 구성 불가능으로 표시합니다. 현재 등록 정보의 값은 쓰기가 가능한 한 계속 변경 될 수 있습니다. [...] 봉인 된 개체에 속성을 삭제하거나 추가하려고하거나 데이터 속성을 접근 자로 변환하거나 그 반대로 변환하려고하면이 실패합니다., 당신은 단순히 코드의 라인을 추가 원하는 것을 달성 할 수 ImageListItem 개체에 대한 이야기, 이제

var myFirstObj = { foo: 1 }, 
    mySecondObj = { bar: "baz" }; 

Object.preventExtensions(myFirstObj); 
Object.seal(mySecondObj); 

myFirstObj.foo = false; // Works fine 
mySecondObj.baz = "hello"; // Works fine 
delete myFirstObj.foo; // May work fine depending on your JS engine 

(function() { 
    'use strict'; 
    myFirstObj.qux = 'something'; // Throws a TypeError 
    mySecondObj.qux = 'something'; // Throws a TypeError 
    delete mySecondObj.foo; // Throws a TypeError 
})(); 

: 여기

는 두 가지 방법의 동작을 설명하는 예입니다

var ImageListItem = function() { 
    var _title; 
    Object.defineProperty(this, "title", { 
     get: function() { return _title; }, 
     set: function (value) { _title = value; } 
    }); 

    // Choose the one which fits your needs 
    Object.preventExtensions(this); 
    // or 
    Object.seal(this); 
}; 
+0

여러분이 링크 한 모질라 페이지는 다음과 같이 말합니다 : "일반적으로 확장 할 수없는 객체의 속성은 여전히 ​​* 삭제 * 될 수 있습니다." 나는 나의 질문에 그 것을 명시하지 않았지만 가지고있는 것이 더 좋을 것이고 나는 그것을 지금 추가하고있다. 그러나 당신의 예제는'delete' *가 실패 할 것이라고 제안합니다. 그러나'preventExtensions'에 대해서 알고있는 것이 좋습니다, 고마워요. – ProfK

+0

어떻게 이것이 정답이되지 않습니까? 당신은 단지 당신이 '속성이 추가되거나 제거되는 것을 막고 싶다'고 말하면서 끝났습니까? 나는 대답을하려고 노력 하겠지만, 당신의 반응은 너무 변덕 스럽습니다. – dclowd9901

+0

@ ProffK 내 대답을 편집하여 필요한 것을 추가하십시오. 한번보세요 : –