只能存储一种对象的数组?

时间:2015-04-05 19:00:46

标签: javascript

是否可以创建一个只允许某些对象存储在其中的数组?有没有一个方法可以为我可以覆盖的数组添加一个元素?

2 个答案:

答案 0 :(得分:2)

是的,你可以,只是覆盖数组的推送数组(假设您要存储的所有数字都是数字而不是以下数据:

var myArr = [];
myArr.push = function(){
  for(var arg of arguments) {
    if(arg.constructor == Number) Array.prototype.push.call(this, arg);
  }
}

只需将Number更改为您想要匹配的构造函数即可。此外,我可能会添加和其他声明或其他东西,如果这是你想要的那样抛出错误。

<强>更新

使用Object.observe(目前仅在chrome中可用):

var myArr = [];

Array.observe(myArr, function(changes) {
    for(var change of changes) {
        if(change.type == "update") {
            if(myArr[change.name].constructor !== Number) myArr.splice(change.name, 1);
        } else if(change.type == 'splice') {
            if(change.addedCount > 0) {
                if(myArr[change.index].constructor !== Number) myArr.splice(change.index, 1);
            }
        }
    }
});

现在在ES6中,您可以执行以下代理:

var myArr = new Proxy([], {
    set(obj, prop, value) {
        if(value.constructor !== Number) {
            obj.splice(prop, 1);
        }
        //I belive thats it, there's probably more to it, yet because I don't use firefox or IE Technical preview I can't really tell you.
    }
});

答案 1 :(得分:1)

不直接。但是您可以在闭包中隐藏数组,只提供自定义API来访问它:

var myArray = (function() {
    var array = [];
    return {
        set: function(index, value) {
            /* Check if value is allowed */
            array[index] = value;
        },
        get: function(index) {
            return array[index];
        }
    };
})();

一样使用它
myArray.set(123, 'abc');
myArray.get(123); // 'abc' (assuming it was allowed)