Node.js类模块系统

Chr*_*ris 1 javascript asynchronous node.js

我正在尝试在node.js中创建一个模块/类来测量异步执行时间,但不明白它的错误.我创建了以下类"Measure.js"

var Measure = module.exports = function(param_timeout, param_cb) {

    this.timeout = param_timeout;
    this.cb = param_cb;
}

Measure.prototype = {
    startDate: "0",
    timeout:"0",
    cb:null,

    start : function() {
        this.startDate = new Date();
        console.log('started');
    },

    stop : function() {
        var stopDate = new Date();
        this.cb(null,(stopDate-this.startDate));
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用它与以下代码:

var Measure = require('./Measure.js');
measure1 = new Measure(100,function(err,result){console.log('result: ' + result)});
measure1.start();
//do something 
measure1.stop();
Run Code Online (Sandbox Code Playgroud)

它工作得很好.但是,如果我试试这个:

var Measure = require('./Measure.js');
measure1 = new Measure(100,function(err,result){console.log('result: ' + result)});
measure1.start();
//do something 
setTimeout(measure1.stop,100);
Run Code Online (Sandbox Code Playgroud)

它不起作用并抛出TypeError:

TypeError: Object #<Object> has no method 'cb'
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题?

Zhe*_*gan 6

当您直接调用object的方法时,this在引用您的对象的方法内部,但是当您尝试将其用作参数时,this将引用全局对象(globalwindow).

在你的情况下更好地更换

setTimeout(measure1.stop,100);
Run Code Online (Sandbox Code Playgroud)

setTimeout(function() { measure1.stop(); }, 100);
Run Code Online (Sandbox Code Playgroud)

更多关于this行为的信息:http://bonsaiden.github.com/JavaScript-Garden/#function.this