使JavaScript数组值在调用时自动更新

使JavaScript数组值在调用时自动更新,javascript,Javascript,很多人对我的最后一个问题感到困惑。我希望我能用这个把事情弄清楚。以下是我需要做的: 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 r

很多人对我的最后一个问题感到困惑。我希望我能用这个把事情弄清楚。以下是我需要做的:

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;
}
看到我在那里做了什么吗?Init值并不重要,是updater函数提取这些值

现在这当然不起作用了,因为arr不会自动调用函数更新程序,也没有事件onGet。有些人可能会说,这简直是胡说八道,你怎么能在一个函数没有被调用的情况下运行它呢。这是真的,但是调用了一个变量(在我们的例子中是arr[0]),所以当调用arr[0]时,您不能将它绑定(链接)到另一个函数吗?本质上,这是一个自动更新程序,因此我的问题是

另外,我已经放弃了在IE7中使用它,那么就用谷歌Chrome怎么样


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
功能onGet(obj){
var指数=0;
var计数器=0;
用于(obj中的var prop){
(函数(thisIndex,thisProp){
对象定义设置(此索引,函数(){
计数器=计数器+1;
返回计数器;
});
})(索引、道具)
索引++;
};
对象定义设置(“长度”,函数(){
返回1000;
});
返回obj;
}
var myObj=[100200300];
onGet(myObj);
警报(myObj[1]);//1
警报(myObj[2]);//2
警报(myObj[3]);//3

alert(myObj.length);//1000您应该研究javascript setter和getter,它允许您在访问或修改某个属性时运行函数。它在对象上非常有效。对于数组来说,这有点困难,因为数组可能具有无限多的属性(其中属性是其标记)。如果您有一个固定大小的数组,那么类似的方法可能会起作用:

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;
var arr=[“固定”、“数组”、“大小”、“将”、“不”、“永远”、“更改”];

对于(var i=0;我和

很抱歉,这不太正确。我正在编辑我的答案,请稍候。Skyd,你太棒了,它可以工作了!非常感谢!事实上,我几乎可以工作了,我会在一秒钟内将代码发布在OP中。如果你想相信我原来的问题,请将你的解决方案发布到我想知道这有什么用如果你真的我想知道的是,我正在创建的任意数组除了概念上的以外并不存在。就像任意数字一样-有用,但在任何物理意义上都不是真实的。可能是