2014-09-24 4 views
0

JS에 관해서는 작은 질문이 있습니다. 이 게시물과 유사합니다 : @ADC의 here, 작은주의 사항이 있습니다.자바 스크립트의 읽기 전용 컬렉션 또는 반복자

var AssocArray = function(){ 
    var collection = new Object(); 

    this.add = function(id, o){ 
     collection[id] = o; 
    } 

    this.remove = function(id){ 
     delete collection[id]; 
    } 

    this.getById = function(id){ 
     return collection[id]; 
    } 

    this.get = function(){ 
     var res = collection; 
     return res; 
    } 
} 

내가 무엇을해야하는지에 가까운 무언가이다 : 그의 코드

그는 자바 스크립트 객체를 생성합니다. 그의 질문은 get() 접근 자에 대한 읽기 전용 속성을 만드는 것이 었습니다.이 속성은 컬렉션 전용 변수를 복제하는 데 주력했습니다.

제 문제는 복제본을 만들고 싶지 않다는 것입니다. 필요한 것은 개별 요소를 소비자에게 제공하지만 get() 멤버가 반환 한 배열에서 새로운 요소를 추가하지 못하게하는 것입니다. 대신 get()에 의해 반환 된 복제본에 새 항목을 추가하는 옵션 대신에 add (id, o) 멤버를 사용하여 새 항목을 추가해야합니다.

그게 가능합니까? 추가/제거 멤버를 사용하는 것 이외의 다른 사용자가 배열을 수정할 수 없도록 컬렉션 변수의 반복자를 만들거나 반환 할 수 있습니까? 당신이 ES6 반복자를 사용할 수, 재설정을위한 다른 적절한 반복자 기계, 탐지 말과 함께

this.iterator = function() { 
    var n = 0; 
    return { 
     next: function() { return collection[n++]; } 
    }; 
} 

또는 :

+1

네이티브 "iterator"를 생각할 수는 없지만 직접 "iterator"클래스를 만들 수는 있습니다. 개인 컬렉션 (얕은 복사본)도'slice() '할 수 있지만 깊은 참조는 수정하지 않습니다. – Ian

답변

0

글쎄, 자신 만의 반복자를 만들 수있을만큼 쉬운 것입니다 :

this.iterator = function() { return collection.values(); }; 

그리고 소비자 등 for...of, iterator.next(),

을 포함한 모든 일반적인 방법으로 반복 할 수