是否可以创建一个只允许某些对象存储在其中的数组?有没有一个方法可以为我可以覆盖的数组添加一个元素?
答案 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)