我如何才能懒惰地评估javascript对象上的字段?

Rut*_*ulV 2 javascript lazy-evaluation

我想知道是否可以执行以下操作:

var obj = {
   counter: (function(){
                if(!this.val){ this.val = 0; }
                this.val += 1;
                return this.val;
            })();
};

console.log(obj.counter); //should output 1
console.log(obj.counter); //should output 2
console.log(obj.counter); //should output 3
...
Run Code Online (Sandbox Code Playgroud)

有没有办法从这样的对象中获取字段,以便每次访问该函数时都会重新评估一个函数?

Nie*_*sol 5

您可以使用吸气剂:

var obj = {};
Object.defineProperty(obj,"counter",{
    get: function() {
        this.val = this.val || 0;
        this.val++;
        return this.val;
    }
});

console.log(obj.counter); // 1
console.log(obj.counter); // 2
console.log(obj.counter); // 3
Run Code Online (Sandbox Code Playgroud)