我正在尝试将延迟计算的元素添加到数组中。这意味着它们的值在它们被访问之前是不会被计算或知道的。这类似于previous question I asked,但用于对象。
我最终为对象所做的是
Object.prototype.lazy = function(var_name, value_function) {
this.__defineGetter__(var_name, function() {
var saved_value = value_function();
this.__defineGetter__(var_name, function() {
return saved_value;
});
return saved_value;
});
}
lazy('exampleField', function() {
// the code that returns the value I want
});但我还没有想出一种方法来实现实数组。数组没有这样的setter。您可以将一个函数推送到一个数组中,但您必须将其作为一个函数来调用,以便它返回您真正想要的对象。我现在要做的是创建一个对象,并将其视为数组。
Object.prototype.lazy_push = function(value_function) {
if(!this.length)
this.length = 0;
this.lazy(this.length++, value_function);
}所以我想知道的是,有没有办法做到这一点,同时仍然是在一个数组上,而不是在一个伪数组上?
更新:只有当value_function返回原始数据类型时,以下函数才有效。
Array.prototype.lazy_push = function(value_function) {
var a = this,
i = this.length;
this.push({
toString: function() {
return a[i] = value_function();
}
});
}如果您尝试推送一个对象,例如其中包含属性的对象,则在直接访问该对象之前,您将无法访问这些属性。这不会发生在setter中,这就是为什么我想要一些Javascript的设置语法。现在,我将使用伪数组,这对于我正在做的事情来说已经足够了。
发布于 2010-06-25 01:21:27
我不是特别喜欢这个答案,但是你能把你的“变量”存储为一个表达式字符串,然后在你需要的时候使用eval()吗?不是很理想,但它很紧凑...
var x = 10, arr = [];
arr.push("x + 10");
alert(eval(arr[0]));
x = 20;
alert(eval(arr[0]));我已经测试过了,它可以工作,即使它不完全是你想要的。
https://stackoverflow.com/questions/2952573
复制相似问题