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

时间:2011-12-15 00:59:24

标签: 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 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

1 个答案:

答案 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/