2014-09-24 55 views
0

我有一個關於JS的小問題。它類似於這個帖子:來自@ADC的here,有一個小警告。JavaScript中的只讀集合或迭代器

在他的代碼

,他創建了一個Java腳本對象:

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()成員返回的數組中添加新元素。相反,他們應該使用add(id,o)成員來添加新項目,而不是向get()返回的克隆添加新的東西。

這可能嗎?是否有可能只創建或返回集合變量的迭代器,以防止用戶修改數組,而不是使用添加/刪除成員?

+1

我想不出任何本地的「迭代器」,但你可以創建自己的「迭代器」類。你也可以'切片()'私人收藏(淺拷貝),但是這不能修復深層引用。 – Ian 2014-09-24 02:19:13

回答

0

那麼,這將是很容易建立自己的迭代器:

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

與其他適當的迭代器機械復位,檢測端沿等

或者,你可以使用ES6迭代器:

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

那麼消費者可以在所有常用的迭代方法,包括for...ofiterator.next()