我可以在JavaScript对象上创建一个属性,每次引用它时都是新的吗?

moa*_*ate 4 javascript

在下面的代码中,输出将是相同的.

function dateObject() {
    this.date = new Date();
}

var wrapper = {
    dateObj: new dateObject()
};

console.log(wrapper.dateObj.date);

setTimeout(function () {
    console.log(wrapper.dateObj.date);
}, 3000);
Run Code Online (Sandbox Code Playgroud)

我实际上偶然发现了这个检查,以确保财产的价值不会改变,但现在我很好奇.有没有办法让一个属性不是一个函数,而是一个函数的评估,每次都是新的?我问,因为你可以用其他语言来做(想想System.DateTime用C#).

Dav*_*ret 8

你可以用Object.defineProperty.

这是一个例子:

function DateObject(time) {
    this._date = new Date(time);
}

Object.defineProperty(DateObject, "now", {
    get: function () {
        return new DateObject(Date.now());
    }
});

Object.defineProperty(DateObject.prototype, "time", {
    get: function () {
        return this._date.getTime();
    }
});
Run Code Online (Sandbox Code Playgroud)

然后每次引用此属性时,它将等于函数评估的结果get:

// calls new DateObject(Date.now()), like Date.Now in C#
var d = DateObject.now;
// calls d._date.getTime()
d.time;                 
Run Code Online (Sandbox Code Playgroud)

如您所见,now已定义DateObject.这就像一个静态属性.然后time在对象的原型上定义,这意味着它将是实例的属性DateObject.

注意:研究第三个参数的enumerableconfigurable属性Object.defineProperty.它们很有用.