gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:25:51 27 4
gpt4 key购买 nike

很多人对我的最后一个问题感到困惑。我希望我能用这个解决问题。这是我需要做的:

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 值并不重要,它是拉取值的更新程序函数。

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

此外,我已经放弃尝试在 IE7 中进行此操作,Google 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

最佳答案

您应该查看 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/

关于javascript - 使 JavaScript 数组值在调用时自动更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513837/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com