2015-04-05 71 views
0

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

+2

不,没有。抱歉。 – Scimonster 2015-04-05 19:02:50

+0

不是直接操作数组,而是创建自己的函数或操作数组的方法,并且可以在将数据实际放入数组之前调整数据。 – jfriend00 2015-04-05 19:15:57

回答

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) 
+0

这很有限制,因为它不支持'.length'或'.slice()',或'.forEach()'等等数组方法......实际上,你甚至不能迭代那个对象中的元素。演示一个可能的方向,但可能不实际。 – jfriend00 2015-04-05 19:18:18

+0

@ jfriend00是的,这些方法将非常有用。实施留给读者的练习:) – Oriol 2015-04-05 19:21:19

+0

我在下面更新了我的答案。 – 2015-04-06 09:25:02

2

是的,你可以,只是覆盖阵列的推阵列(让我们说你想存储的数字比执行以下操作:

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

简单地改变Number你想匹配任何构造此外,我可能会添加和else语句左右如果这就是你想要的,就会引发错误。

UPDATE:

使用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. 
    } 
}); 
+0

但是,当数组设置为arr [3] =“不是数字”时,这会工作吗? – RedHatter 2015-04-05 22:19:52

+0

我更新了我的答案 – 2015-04-06 09:24:19

相关问题