2015-04-05 72 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

相關問題