3

我正在尝试做类似的事情

var foo = {
    bar: '' // do some magic here
};

只有当我需要使用该值(稍后在页面上)时,只需简单地调用该属性将运行延迟加载并发回该值

典型的例子是我有一个在页面打开时加载用户的 restfull API。进入菜单后,我想访问与其相关的属性(另一个对象),但它在另一个 api 中,我不想在开头加载所有内容。

属性调用是否有某种监听器?

4

3 回答 3

2

用于动态Object.definePropery计算foo.bar。它适用于所有现代浏览器

var foo = { };
Object.defineProperty(
    foo,
    "bar",
    {
        get: function () {
            return 'magic return value';
        }
    }
    );

JSFiddle:http: //jsfiddle.net/wFYxb/

于 2013-08-01T14:52:40.563 回答
1

听起来您的属性应该只是一个函数定义,并且您按需执行该函数:

var foo = {
   bar: function() { return goDoSomething(); }
};

foo.bar();

为了保存它,可能还要多一点 - 用该值填充另一个变量,并在它存在后继续使用它。

var foo = new function () {
    var _bar;
    this.bar = function () {
        if (!_bar) {
            _bar = goDoSomething();
        }
        return _bar;
    }
} ();


function goDoSomething() {
    console.log("goDoSomething();");
    return 4;
}
于 2013-08-01T14:49:19.280 回答
1

如果这正是您想要做的,Firefox/Chrome/其他一些中的所有 JavaScript 对象都具有__defineGetter__可用于定义延迟计算值的属性。

> a.__defineGetter__('b', function () {return 'c';})
> a.b
"c"
于 2013-08-01T14:53:21.053 回答