首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法在Javascript数组中为惰性变量定义getter?

有没有办法在Javascript数组中为惰性变量定义getter?
EN

Stack Overflow用户
提问于 2010-06-02 03:17:28
回答 5查看 5.9K关注 0票数 14

我正在尝试将延迟计算的元素添加到数组中。这意味着它们的值在它们被访问之前是不会被计算或知道的。这类似于previous question I asked,但用于对象。

我最终为对象所做的是

代码语言:javascript
运行
复制
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。您可以将一个函数推送到一个数组中,但您必须将其作为一个函数来调用,以便它返回您真正想要的对象。我现在要做的是创建一个对象,并将其视为数组。

代码语言:javascript
运行
复制
Object.prototype.lazy_push = function(value_function) {
  if(!this.length)
    this.length = 0;
  this.lazy(this.length++, value_function);
}

所以我想知道的是,有没有办法做到这一点,同时仍然是在一个数组上,而不是在一个伪数组上?

更新:只有当value_function返回原始数据类型时,以下函数才有效。

代码语言:javascript
运行
复制
Array.prototype.lazy_push = function(value_function) {
  var a = this,
  i = this.length;
  this.push({
    toString: function() {
      return a[i] = value_function();
    }
  });
}

如果您尝试推送一个对象,例如其中包含属性的对象,则在直接访问该对象之前,您将无法访问这些属性。这不会发生在setter中,这就是为什么我想要一些Javascript的设置语法。现在,我将使用伪数组,这对于我正在做的事情来说已经足够了。

EN

Stack Overflow用户

发布于 2010-06-25 01:21:27

我不是特别喜欢这个答案,但是你能把你的“变量”存储为一个表达式字符串,然后在你需要的时候使用eval()吗?不是很理想,但它很紧凑...

代码语言:javascript
运行
复制
var x = 10, arr = [];
arr.push("x + 10");
alert(eval(arr[0]));
x = 20;
alert(eval(arr[0]));

我已经测试过了,它可以工作,即使它不完全是你想要的。

票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2952573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档