JavaScript - 属性 生命周期和构造方法触发

JavaScript - Property Lifetime and Constructor Method Triggering

我真的想让 Date.now() 作为 属性 可用,而不是函数调用或方法。换句话说,我想要 clock.now.go 到 return 一个 unix 时间戳。我无法让它工作。 returned 时间戳与原始调用停滞不前。下面是显示控制台结果的代码。是否可以通过调用 属性 来触发新的时间戳,或者是否需要函数调用,即“()”?

//Revealing Module Pattern (Public & Private) 
var clock = (function() {

    // object to expose as public via return
    var pub = {};

    //constructor function
    function Now() {
        this.getNow = function() {
            return ( Date.now() );
        };
        this.go = this.getNow();
    }

    //private
    var now = new Now();
    //public
    pub.test1 = now;
    pub.test1.go;  //clock.test1.go returns 1461888755076
    pub.test1.getNow();  //clock.test1.getNow() returns 1461888767477 (GOOD)
    pub.test2 = now.getNow();  //clock.test2 returns 1461888755076 (STALE)
    pub.test3 = now.go;  //clock.test3 returns 1461888755076 (STALE)
    //Return just the public parts
    return pub;
}());

如果您希望它显示为 属性,但实际上是一个实时函数调用,那么您可以使用 Javacript getter.

//Revealing Module Pattern (Public & Private) 
var clock = (function() {

    // object to expose as public via return
    var pub = {};

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

console.log(clock.now);   // returns live time

或者,可以浓缩为:

//Revealing Module Pattern (Public & Private) 
var clock = (function() {

    // object to expose as public via return
    var pub = { 
        get now() { 
            return Date.now();
        }
     };
     return pub;
}());

console.log(clock.now);   // returns live time

或者,即使只是这样(没有封闭模块模式):

var clock = { 
    get now() { 
        return Date.now();
    }
 };

console.log(clock.now);   // returns live time

你可以用这样的 getter

var obj = {
           _time : "",
           get time () {
             this._time = new Date();
             return this._time;
           },
           set time(val) {
             this._time = val;
           }
};

document.write("<pre>" + obj.time + "</pre>");