Javascript:仅在其自己的函数内直接修改数组

时间:2014-01-08 09:18:58

标签: javascript knockout.js

我有一个非常简单的功能:

 var errorsViewModel = function () {
            var self = this;                
            var _errors = ko.observableArray([]);    
            self.get = function () {
                return _errors;
            };    
            self.insert = function ( error ) {
                _errors.push(error);
            };  
   }

我想要实现的是使_errors数组只能在其自己的函数中直接修改。也就是说,来自外部的用户可以通过get方法获取用于阅读的数组,并仅通过insert方法插入itsert项。

但是不能做这样的事情:

var err = new errorsViewModel();
var array = err.get();
array.push('item'); 

而是使用errorsViewModel接口:

err.insert('some error');

这可能吗?

2 个答案:

答案 0 :(得分:3)

只需复制返回的数组:

self.get = function () {
    return _errors.slice(0);
};  

这样,当调用get时,调用者可以根据需要对其进行更改 - 但不会修改原始文件。

答案 1 :(得分:1)

为了确保您的数组无法从作用域外部访问,我建议您通过ko.computed公开数组,然后在插入时通知它的侦听器。

var errorsViewModel = function () {
    var self = this;                
    var _errors = [];    

    self.errors = ko.computed(function () {
        return self.get();
    });

    self.get = function () {
        return _errors.splice(0);
    };    

    self.insert = function ( error ) {
        _errors.push(error);
        self.errors.valueHasMutated();
    };  
}