很多人对我的上一个问题感到困惑。我希望我能用这个清理一下。这就是我需要做的事情:
var arr = ["Init Value", "Does Not", "Matter"];
arr.onGet = updater; // Register arr with updater function
alert(arr[0]); // should return 1;
alert(arr[0]); // should return 2;
alert(arr[0]); // should return 3;
alert(arr[0]); // should return 4;
alert(arr[0]); // should return 5;
var counter = 0;
function updater(){
counter = counter + 1;
return counter;
}
看看我在那里做了什么?初始值无关紧要,这是拉取值的更新程序功能。
现在这当然不起作用,因为arr不会自动调用函数更新程序并且没有事件onGet。有些人可能会说,这只是疯狂的谈话,如果甚至没有调用它,你怎么能运行一个函数。这是真的,但是调用VARIABLE(在我们的例子中是arr [0],所以当调用arr [0]时,你不能将它绑定(链接)到另一个函数吗?实质上,这是一个自动更新程序因此我的问题。
另外,我已经放弃尝试在IE7中使用它,那么谷歌浏览器呢?
Skyd解决方案:
function onGet(obj) {
var index = 0;
var counter = 0;
for (var prop in obj) {
(function(thisIndex, thisProp) {
obj.__defineGetter__(thisIndex, function() {
counter = counter + 1;
return counter ;
});
})(index, prop)
index++;
};
obj.__defineGetter__("length", function() {
return 1000;
});
return obj;
}
var myObj = [100,200,300];
onGet(myObj);
alert(myObj[1]); // 1
alert(myObj[2]); // 2
alert(myObj[3]); // 3
alert(myObj.length); // 1000 <-- Arbitary value which you can change
答案 0 :(得分:3)
您应该查看javascript Setters和Getters,它允许您在访问或修改某个属性时运行函数。它在物体上很有效。对于数组,它有点难,因为数组可能具有无限属性(其中属性是其指标)。如果你有一个固定大小的数组,那么这样的东西可能会起作用:
var arr = ["Fixed", "Array", "Size", "Will", "Not", "Ever", "Change"];
for (var i=0; i<arr.length; i++){
debug(i);
(function(index){
arr.__defineGetter__(index, function(){return updater();});
})(i);
}
alert(arr[0]) // will return results of updater() call;
使用带有getter / setter的自定义对象而不是使用固定大小的数组可能更好。
另外,请查看以下链接:Getter/setter on javascript array?和http://javascriptweblog.wordpress.com/2010/11/15/extending-objects-with-javascript-getters/