【问题标题】:Read Only Collection or Iterator in JavaScriptJavaScript 中的只读集合或迭代器
【发布时间】:2014-09-24 02:12:26
【问题描述】:

我有一个关于 JS 的小问题。它类似于这篇文章:@ADC 的here,但有一点需要注意。

在他的代码中,他创建了一个 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() 返回的克隆添加新内容。

这可能吗?是否可以只创建或返回集合变量的迭代器,以防止用户修改数组而不是使用添加/删除成员?

【问题讨论】:

  • 我想不出任何本机“迭代器”,但您可以创建自己的“迭代器”类。你也可以slice()私人收藏(浅拷贝),但这并不能修复深度引用。

标签: javascript arrays private-members


【解决方案1】:

好吧,创建自己的迭代器很容易:

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

与其他适当的迭代器一起用于重置、检测结束等。

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

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

然后消费者可以以所有常用方式进行迭代,包括for...ofiterator.next()等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 2012-07-07
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 2014-05-17
    • 2011-02-17
    • 1970-01-01
    相关资源
    最近更新 更多